Bu sorgu sql enjeksiyonu savunmasız mı?

6 Cevap php
$myq = sprintf("select user from table where user='%s'", $_POST["user"]);

Ben yukarıdaki sorgu SQL enjeksiyon kullanılarak istismar edilebilir olmadığını bilmek istiyorum. Bu belirli bir sorgu için sprintf kırabilir herhangi gelişmiş SQL enjeksiyon tekniği var mı?

6 Cevap

Ben bir giriş deneyin ... özellikle gelişmiş olması gerektiğini sanmıyorum

' OR 1 = 1 OR user='

Diğer bir deyişle, size SQL alırsınız:

select user from table where user='' OR 1 = 1 OR user=''

Bu gerçekten çalıştırmak istediğiniz bir sorgu gibi görünüyor mu? (Şimdi yerine tablolar bırakarak, ya da benzer bir şey olasılığı düşünün.)

Alt satırda bir Parametrelenmiş sorgu kullanarak gerektiğidir.

Using sprintf doesn’t give you any more protection than using simple string concatenation. sprintf sadece zaman basit PHP'nin dize birleştirme kullanarak biraz daha okunabilir o sahip edilir avantaj. %s biçimini kullanarak Ama sprintf basit dize birleştirme daha fazlasını yapmak değildir:

$str = implode('', range("\x00", "\xFF"));        // string of characters from 0x00 – 0xFF
var_dump(sprintf("'%s'", $str) === "'".$str."'"); // true

Eğer **mysql_real_escape_string** gibi (MySQL kullanıyorsanız varsayarak, bu durumda bir string declaration in MySQL) içine veri eklemek istediğiniz bağlamsal özel karakterler kaçış işlevleri kullanmak gerekir yapar:

$myq = sprintf("select user from table where user='%s'", mysql_real_escape_string($_POST["user"]));

Evet, orada bir potansiyel sorun var derim :)

Sen need to escape: \x00, \n, \r, \, ', " ve \x1a. sprintf() does not do that, sprintf(), sadece sizin belirlediğiniz formata göre sağlayacağı tampon içine vermek değişkin ne argümanlar dizeleri hiçbir değişiklik genişler gelmez.

Dizeleri dönüştürülmüş olan varsa nedeniyle magic quotes (Rob Yorumlar belirtildiği gibi) onun olası değil sprintf(). Bu durumda, ben highly onları devre dışı bırakmanızı öneririz.

zaman $ _POST ["user"] "'; KAPATMA;" eşit olur - Ne olurdu?

Aslında, sihirli tırnak kapatın.

: Uygun, kullanımı filtreler bulunuyor PHP, içinde

$inUser = $_POST['user'];
$outUser = filter_var($inUser, FILTER_SANITIZE_STRING);

Filtreler HTML etiketlerini dışarı şerit ve çeşitli karakterler kaçış.

Buna ek olarak, veritabanı sizin için kaçış sağlayabilirsiniz:

$inUser = $_POST['user'];
$outUser = mysqli_real_escape_string($conn, $inUser);

Bu MySQL vb çift tırnak, tek tırnak, gibi özel özel karakterleri kaçar

Son olarak, parametreli sorgular kullanmanız gerekir:

$sql = "SELECT user FROM table WHERE user = ?";
$stmt = $pdo->prepare($sql);
$params = array($outUser);
$stmt->execute($params);

Parametreli sorgular otomatik vb dizeleri, etrafında tırnak eklemek, ve SQL enjeksiyonu daha da zor hale başka kısıtlamaları vardır.

Ben bu sırayla her üç kullanın.

Evet.

Biri formda kullanıcı olarak aşağıdaki koyarsanız:

'; delete * from table