{$ _GET ['Id']} ve '". $ _GET [' Id ']."' Arasındaki fark?

4 Cevap php

Yazı arasında herhangi bir fark var mı

{$_GET['id']}

ve

'".$_GET['id']."'

Bir sql açıklamada? aynı şekilde çalışır hem

4 Cevap

Onun her zaman kötü bir fikirdir, doğrudan SQL içine bir get isteği veri koymak, ve SQL enjeksiyonu önlemek için çok kolay bir yolu vardır için.

Eğer bir sayısal kimliği istiyorum biliyorum basit durumda, o zaman sadece sayısal olarak değerini zorlayabilir ve daha sonra SQL enjeksiyon şansı yoktur. sprintf() bir yolu en okoman olabilir kullanım, böyle bir belki bir şey:

$sql = "INSERT INTO table VALUES(".sprintf("%d",$_GET['id']) .")";

Ben onun çirkin ve kötü formu düşünüyorum rağmen. Böyle bir şey daha güzel:

$sql = "INSERT INTO table VALUES(".(int)$_GET['id']) .")";

Sadece bir int değer atmalarını - Hangi int atamaxs onun değil bir sayı - eğer siz veya ne isterseniz olmayabilir hangi bir "0" alırsınız.

Diğer alternatifler (ve veri bir sayı olması gerekiyordu değilken için) gibi add_slashes() veya yukarıda belirtildiği gibi kaçış fonksiyonlarını kullanarak include mysql_real_escape_string().

IMHO, içinde PHP veritabanı erişimi kullanmak ve çok kolay bir SQL enjeksiyon korumak için en iyi yolu, yeni PHP PDO kütüphane kullanımı için (http://php.net/PDO). Bu hiçbir veri içeren SQL dizeleri yazmak ve veri veritabanı sunucusunun kendisi içinde sonradan eklenmiş olmasına izin verir. Bu formda SQL enjeksiyon yapmak için hiçbir yolu kesinlikle yoktur.

İşte bazı örnek kod:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$stmt = $dbh->prepare("INSERT INTO table VALUES (?)");
$stmt->bindParam(1, $_GET['id']);
$stml->execute();

Gördüğünüz gibi, veriler SQL sorgusu kendisi eklenmiş ve kaçan kadar gerek değil.

SQL ifadesinde bu doğrudan birini kullanarak çok kötü bir fikir olduğunu. Bu SQL enjeksiyonlar için izin verir. mysql_real_escape_string gibi bir şey kullanarak girişleri sterilize emin olun.

İkisi arasındaki temel fark üst tek, çift tırnak kullanan bir dize içinde kullanılabilir olmasıdır. Alt, ancak, tek veya çift ya da tırnak kullanılabilir.

Bildiğim kadarıyla hiçbir fark, ama bunu yapıyor olmalıdır? Eğer web sitenizde sql injection saldırılarına geniş açık bırakarak konum bakan internet ise gelir sql sorgu içine unsanitised girişini sağlayan ediyoruz.

Burada daha ileriye gitmeden önce okumanız gereken bir Q & A var:

http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php

If you use a variable - especially an associative array - in a string, you can be quite sure that it will lead to errors. It's just bad style. I - personally - don't like the second alternative either.

sprintf( '... %d ...', $_GET[ 'id' ] );

Bir dize içine bir değişken koyarak benim en sevdiğim yoludur.