2012-10-12 19 views
6

Olası Çoğalt:
Best way to prevent SQL injection in PHP?SQL Injection Koruması - tek tırnak

Ive SQL Enjeksiyon benim alanlarını korumak için test biraz yapıyor. Bunu yapmanın birkaç yolu olduğunu görüyorum, Kullanıcı girdilerime kaçarak, eğik çizgi ekleyerek veya daha iyisi parametreli sql deyimlerini kullanarak. Birkaç SQLi isteklerini denenmiş ve hata benim test sayfası olsun, ya da herhangi bir ek verileri gösteremedi

$q=$_GET["q"]; 
$game = mysql_query("SELECT * FROM `Games` WHERE `id` = '$q'"); 
$game = mysql_fetch_array($game); 

echo "<h4>ID: ".$game[0]."<br /></h4>name: " . $game[1]; 

Ve bu test kodu vardı

...

Ama ($ q tek tırnak Kaldırıldı) bu benim sql deyimi kod değişti ..

$game = mysql_query("SELECT * FROM `Games` WHERE `id` = $q"); 

Basit SQLi 's gerçekleştirmek ve bazı sonuçlar alabilir.

Kullanıcı girdilerimi sadece tek tırnakta yeterince iyi kaydediyor? Yoksa daha karmaşık SQLi tekniklerine baktım mı?

+3

Hazırlanmış bir deyimle PDO kullanın. Bu, 2012 yılında şu an itibariyle daha güvenli bir seçenek. – itachi

+1

php sunucunuzun SQL enjeksiyonunu engellemeye yardımcı olan 'magic_quotes_gpc = ON' olup olmadığını kontrol edin – jcho360

+0

Hazırlanan ifadeleri kullanın (mysqli veya POD). Bir sürü güçlük çıkarır ve mysql kullanımdan kaldırılır. –

cevap

1

bu girişi deneyin:

abc' OR id <> ' 

aşağıdaki deyimi yol açacaktır: yerine sadece birinin tüm oyunları döneceğini

"SELECT * FROM `Games` WHERE `id` = 'abc' OR id <> ''" 

. Eğer sayfanız sonuçların tamamını göstermesine izin veriyorsa, o zaman kesinlikle o kadar çok şey görürsünüz ...

Dışarıdan çıkarılan ifadelerle PDO kullanmak, kullanıcı girdisini SQL deyimine eklemeden önce en az mysqli_real_escape_string() işlevine sahip olmaktır. .

SQL-Injection çok daha fazlasını yapabilir, en kötü durumda bile sunucu üzerinde kontrol sahibi olabilirsiniz.Bu tabloya bir göz atın. SQL Injection Cheat Sheet

+0

Merhaba, sadece denedim Bu girdi ve hiçbir şey iade edildi. Ben buna benzer çok çalıştı ve aynı sonucu aldım, bu yüzden tek tırnakların yeterli olup olmadığını soruyorum. Bu saldırıları durduran @ jcho360'ın "magic_quotes_gpc = ON" olması olabilir mi? – user1741863

+1

@ user1741863 - Bu mümkün, çok kolay bir şekilde kontrol edebilirsiniz, sadece phpin page 'phpinfo(); 'çağrıp magic_quotes_gpc için arama yapın. Bir sunum yapmalı ve [SQL-Enjeksiyonlarla oynayabileceğiniz] bir sayfa hazırladım (http://www.martinstoeckli.ch/hash/hash_sqlinjection.php?step=2), maalesef Almancadır. – martinstoeckli

+0

gerçekten açık. Sayfa için teşekkürler, google kurtarmaya çevir. – user1741863

0

Eğer

$game = mysql_query("SELECT * FROM `Games` WHERE `id` = '$q'"); 

varsayalım kullanıcı girişi eğer 1\'

olacak escape_string çıkışı daha 1' olduğunu let tek tırnak kullanmak zorunda Bu durumda mysql_real_escape_string() fonksiyonunu

kullanmalıdır sorgudan daha fazla kullanmayanlar,

SELECT * FROM `Games` WHERE `id` = 1' 

//that is wrong or a injection 

Ama iyi ve kaldırabilirsiniz tek tırnak durumda

SELECT * FROM `Games` WHERE `id` = '1\'' 

yılındasql-injection

+1

'mysql_ * 'kullanımdan kaldırıldı ve gelecekteki sürümde kaldırılacak. – itachi

+0

@itachi aşırı akılda kalmayın.Soruyu düzgün bir şekilde sorgulayın.Kullanıcı girdilerimi ekleyerek, eğik çizgi ekleyerek veya parametreli sql deyimlerini kullanarak daha iyisi .... ' – StaticVariable

+0

Olumsuz oylama, sorunun cevabıyla alakası yoktur. . Olması gerektiği gibi değil mi? Zaten kullanımdan kaldırılmış bir işlev kullanıyorsunuz. Bu yüzden bu cevap gözümdeki bütünlüğü ve dolayısıyla düşüşten yoksundur. – itachi

İlgili konular