Bu PHP bir mysql_query yapısı güvenli bir yoldur

6 Cevap php

Ben denedim ve ateş dışında sunucuya özel sorgular yaparak bir SQL enjeksiyon elde etmek için çalıştık.

Php içinde, tüm değişkenler böyle bir dize sorgu içine geçirilir.

Bu aşamada, Not, $ _POST dokundu olmamıştır.

mysql_query('INSERT INTO users (password, username) VALUES(' . sha1($_POST['password']) . ',' . $_POST['username'] . '));

Güvenli bir yol bir değişiklik yapmak için mi?

6 Cevap

Kesinlikle mysql_real_escape_string ile adını kaçmak gerekir.

Tabii ki en iyi çözüm hazırlanmış deyimleri kullanmak olacaktır. Bu şekilde sorgu sözdizimi ve veri ayırma mysql API düzeyinde yapılır.

Diğerleri de belirttiği gibi, değerler kesinlikle tırnak ile çevrili olmalıdır. Özellikle kısa olanlar.

what you are doing there is dangerous since someone can send a POST request with an evil user name. you can either check every parameter and escape it, additionally you could use mysqli (http://php.net/manual/en/book.mysqli.php), and bind the parameters using prepare+bind.

the first step is good to avoid exploits on other users, while the second is good for your server side safety.

Ayrıca bu soruyu kontrol: http://stackoverflow.com/questions/47087/how-do-you-prevent-sql-injection-in-lamp-applications

Kodunuzu kontrol ben size eklediğiniz değişmezleri alıntı yok zaman hepsi çalışıyor şaşırdım - Senin gibi bir kod üreten olacaktır:

INSERT INTO user (password, username) VALUES (abc1234fg00000, admin);

Yani bir hatayı her zaman verecektir. Bu sadece bir yazım hatası olduğunu varsayarsak ....

Mysql uzantısı sadece çağrı başına bir sorgu vererek enjeksiyon saldırıları gerçekleştirmek için yeteneğinizi sınırlar. Ayrıca, bir INSERT deyimi üzerinde bir enjeksiyon saldırısı için sınırlı bir kapsamı var. Eğer insert deyimi içine yapıştırma önce nötr biçime gösterimini değiştirmek olması böyle bir saldırı için potansiyel bir yol olmadığı anlamına gelir ekleyin. Birisi Mesajları tek tırnak (o zaman sen var yoksa magic_quotes önerilmiyor hangi kılınmış) içeren bir kullanıcı adı Ancak, sizin kod should devrilebilir.

Eğer hesap doğrulama için aynı yöntemi uygulayabilirsiniz OTOH sonra enjeksiyon saldırıları için geniş açık - düşünün

"SELECT 1 
FROM users
WHERE username='" . $_POST['username'] . "'
AND password='" . sha1($_POST['username'] . "';";

$ _POST ['Username'] "admin 'OR 1" varsa o sistem tehlikeye girer.

Eğer farklı bir işlevi kullanarak güvenli veri yaptık sürece always mysql_real_escape_string () kullanın (örneğin sha1, bas64_encode .... ama değil addslashes) olmalıdır

C.

Tüm gelen değerlere daha güvenli hale yardımcı gerektiğini ekleyerek, http://php.net/mysqli.real-escape-string bak.

this is insecure, unless magic_quotes_gpc configuration directive is turned on.
var_dump(ini_get('magic_quotes_gpc')); or phpinfo(); can show you the actual value

Bu yönerge, kirli kalktı ve tüm nefret olduğunu unutmayın. Ve bazı şifreler işe yaramaz hale getirecektir.

Onlar yürürken hemşirelere "Bind değişkenleri" çığlık, ev eski dostlar beni bulacaksınız eğer bazen merak ediyorum.

Bu 2010 kişi değil 1995 bulunuyor.

Bind değişkenleri!

Bind değişkenleri!