2010-06-30 19 views
6

Bu yüzden, kullanıcının herhangi bir SQL enjeksiyonu yapmayacağı ve numaranın sadece ve her zaman tam sayı olacak şekilde güvenli olması için yeterli olduğunu merak ediyordum. GetArticle işlevindeki $ id SQL sorgusuna bağlanır.(int) ve is_int() güvenli mi?

<?php $id = (isset($_GET['id']) && is_int((int)$_GET['id'])) ? (int)$_GET['id'] : false ?> 
<?php $news = $class->getArticle($id) ?> 

Test ettiğim kadarıyla iyi çalıştı, ama tamamen emin olmadığım için size soru sormamayı tercih ediyorum! Tamam, insanlar hazırlanan açıklamaların hile yaptığını söylüyor. Gerçekten yapacaklar mı? Mesela, param tamsayı olarak bağlanırsa tamsayı olarak başka bir şey olmayacağından emin olabilir miyim?

Şimdiden teşekkürler!

+2

Sanırım "is_int ((int) [ANYTHING]) her zaman" true "değerini döndürecek ve dolayısıyla gereksiz olacak. Bir şeyin ** bir "int" ye dönüştürülebildiğini ve daha sonra dönüştürmeyi gerçekleştirmek için '(int)' yi kullanıp kullanamayacağını test etmek için 'is_numeric' kullanın. Ya da (int) tanınmayan değerler üzerinde bir “int” değeri yaratacak şekilde ilk adımı bırakın. – MvanGeest

+0

$ _GET parametreniz bir formdan geliyorsa dikkat edin | bool is_int (karışık $ var) | Verilen değişkenin türünün tam sayı olup olmadığını bulur. Not: Değişkenin bir sayı mı yoksa sayısal bir dize mi (örneğin, her zaman bir dize olan form girişi gibi) sınamak için, is_numeric() yöntemini kullanmalısınız. – Redlab

cevap

10

Sadece uygun tipine bunları döküm yazabilirsiniz:

$number = intval($_GET['id']); 
$string = mysql_real_escape_string(strval($_GET['str'])); 

Eğer almak ne bekliyoruz emin olun.

Daha iyi bir çözüm, sql enjeksiyonunu önlemek için Prepared statements kullanmaktır.

+0

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

+7

Katılıyorum, neden sadece * Hazırlanmış ifadeler * kullanın ve parametre kontrolünü unutun. –

+0

Evet, daha sonra söylediğim gibi, paramiksleri sql sorgusuna bağlıyorum, ama gerçekten yapmak zorunda olduğu şeyi yapacak mı? Yani: bind_param ('i', $ id); hile yapacak? – Rihards

0

Bunun bir SQL-Injection için nasıl kullanılacağını hiçbir şekilde düşünemiyorum. Yani yeterince güvenli olduğunu söyleyebilirim.

0

sadece kullanın:

$id=(int)@$_GET['id']; 

$ _GET eğer [ 'id'] ayarlanmamış $ id 0.
olacak size kimliği doğru ayarlanmış olup olmadığını kullanımını test etmek istiyorsanız:

if ($id=(int)@$_GET['id']){ 
    // 
} else { 
    //invalid id 
} 
5

Hazırlanan ifadeleri kullanın. Onları kullanmamanın bir nedeni yoktur. O zaman "Bu yeterince iyi mi?" Diye sormak zorunda değilsin.

+0

Giriş bir sayıya dönüştürülürse, "yeterince iyi" olduğunu biliyorum. Eğer hazırlanan ifadeleri atlamak (WHERE IN ile sorgulama yapmak) veya daha fazla performans göstermesi (bir sorguda büyük bir toplu iş grubu yapmak) daha kolaysa, bunları kullanmama nedenleri vardır. –

İlgili konular