SQL enjeksiyon kodumu nasıl savunmasız olduğunu?

5 Cevap php

Tamam ben böylece için değil, aşağı-oy lütfen, bu bir hack tavsiye soru olmak istemiyorum. Ben bir web mağazası çalışmak ve ben bizim eski PHP sayfaları bazı kullanıcı adı SQL enjeksiyon savunmasız ve ne kadar kötü bilmek istiyorum buldum.

Biz giriş formunda POST kullanıcı girişi gömmek için bir PHP dize kullanabilirsiniz.

$uname = $_POST['username'];
$pass  = md5($_POST['pass']);
$sql = "SELECT * FROM users WHERE username='$uname' AND password='$pass' AND userlevel='user'";
...

sonra ben sorguyu çalıştırın.

Şimdi, hiçbir SQL uzman değilim, ben sadece phpMyAdmin üzerinde araya ne kullanın. Ama bunun yerine kullanarak bir kullanıcı adı olmadan oturum başardı:

' OR 1 '

Ben kullanmak mysql_real_escape_string, kullanıcı girişi kaçmak için biliyorum.

Benim soru nasıl savunmasız bu kodu ve birisi şifresini bu sayfaya giriş ve olamazdı, değil mi? Belki onlar adınızı gerek düşünürdüm, ama sadece kaba şifreyi zorlayabilir. Ama ben hiçbir SQL gurusu değilim ve bazı hileler bize karşı kullanılan olabilir merak ediyorum.

Biz MySQL kullanabilirsiniz.

Ve ben giriş doğrulama üzerinde herhangi bir ders gerekmez lütfen, ben bu kadar kötü biliyorum. Brute-zorla olamaz bu yüzden bizim sayfada zaman aşımı ve lokavt gibi şeyler, bir sürü yapıyor olmalıdır.

5 Cevap

"Birisi parolası gerekir bu sayfaya giriş ve olamazdı:" Evet, trivially. Kullanıcı adı deneyin yourfavoriteadmin' OR 1; --.

May as well link this, since certainly somebody will...

Bu çok savunmasız. Eğer gibi tüm şık şeyler biliyorsanız mysql_real_escape_string neden zaman kaybetmeyin ve bu soruyu soruyorsun? Bunu tespit, tüm bu kod üzerinde olmalıdır. Bilirsin, gibi, NOW.

Yazıldığı gibi kod tüm teknik savunmasız değildir. SQL sorgu değişkeni $ username içeriyor ancak bunu başlatmak ya da bir şey için atmadı. Bu bir hata var ve MySQL geçerli bir sonuç almak asla.

Eğer bu hatayı düzeltmek Ancak, bir kez sen) (mysql_real_escape_string ile değişkenleri kaçan olmalıdır.

http://us.php.net/manual/en/function.mysql-real-escape-string.php

Eğer PHP> = 5.2 ile çalışıyorsanız, her zaman, herhangi bir SQL sorgusunda kullanmadan önce verilerinizi temizlemek, sahip the Filter functions.

Simple question : why don't change the order WHERE pass = 'blabl' AND username = 'bla' ? Have you an index on this fields ?

Başka bir soru: Bu hat ile nokta nedir

$uname = $_POST['username'];

sadece birleştirme in / çift alıntı etkisini alıntı için, bir değişken ekleyerek? Veri filtreleme ne de kaçan olmadan?

$ _POST ['username'] nerede deneyin:

no one'; delete from users --