Bu veritabanı sorguları gelince, her zaman denemek ve hazırlanmış parameterised sorguları kullanın. mysqli
ve PDO
kütüphaneler bu destek. Bu gibi mysql_real_escape_string gibi kaçış fonksiyonlarını kullanarak daha sonsuz güvenlidir.
Evet, mysql_real_escape_string etkili sadece bir dize kaçan fonksiyonudur. Bu sihirli bir değnek değildir. Bunu yapacak hepsi tek bir sorgu dizesinde kullanmak güvenli olabilmesi için de tehlikeli karakterleri kaçış. Eğer önceden girişleri sterilize yoksa Ancak, o zaman bazı saldırı vektörleri savunmasız olacaktır.
Aşağıdaki SQL düşünün:
$result = "SELECT fields FROM table WHERE id = ".mysql_real_escape_string($_POST['id']);
You should be able to see that this is vulnerable to exploit.
Imagine the id
parameter contained the common attack vector:
1 OR 1=1
Orada kodlamak için orada hiçbir riskli karakter var, bu yüzden düz kaçan filtreden geçecek. Bizi terk:
SELECT fields FROM table WHERE id= 1 OR 1=1
Which is a lovely SQL injection vector and would allow the attacker to return all the rows.
Or
1 or is_admin=1 order by id limit 1
ki üretir
SELECT fields FROM table WHERE id=1 or is_admin=1 order by id limit 1
Hangi saldırganın bu tamamen kurgusal örnekte ilk yöneticinin ayrıntıları dönebilirsiniz.
Bu işlevler yararlı iken, bunlar dikkatle kullanılmalıdır. Tüm web girişler bir dereceye kadar doğrulanmış olduğundan emin olmak gerekir. Bu durumda, biz bir sayı olarak kullandığınız bir değişken, aslında sayısal olup olmadığını kontrol etmedi çünkü biz istismar edilebilir görüyoruz. PHP Yaygın olarak, yüzen, girişler tam sayı olduğu alfanümerik vb kontrol fonksiyonları bir dizi kullanmak Ama SQL geldiğinde, hazır deyimi çoğu değerini dikkate almalıdır. Veritabanı fonksiyonları 1 OR 1=1
geçerli bir hazır olmadığı bilinmektedir olurdu gibi bir hazır deyimi ise Yukarıdaki kod güvenli olurdu.
Htmlspecialchars'dan gelince (). Bu kendi başına bir mayın tarlası bulunuyor.
Farklı html ilgili kaçan fonksiyonların bir bütün seçim var PHP gerçek bir sorun, ve ne yapacağını tam olarak hangi işlevleri üzerinde net bir kılavuz yoktur.
Eğer bir HTML etiketinin içine iseniz Öncelikle, gerçek sorun bulunmaktadır. Bakmak
echo '<img src= "' . htmlspecialchars($_GET['imagesrc']) . '" />';
Biz bir HTML etiketinin içine zaten konum, bu yüzden gerek yok < veya> tehlikeli bir şey yapmak. Bizim saldırı vektörü sadece olabilir javascript:alert(document.cookie)
Şimdi çıkan HTML gibi görünüyor
<img src= "javascript:alert(document.cookie)" />
Saldırı düz aracılığıyla alır.
Bu kötüleşiyor. Neden? htmlspecialchars (bu şekilde çağrıldığında) sadece çift tırnak ve tek değil kodlar çünkü. Biz Yani eğer
echo "<img src= '" . htmlspecialchars($_GET['imagesrc']) . ". />";
Bizim kötü Saldırgan artık yepyeni parametreleri enjekte edebilir
pic.png' onclick='location.href=xxx' onmouseover='...
bize verir
<img src='pic.png' onclick='location.href=xxx' onmouseover='...' />
Bu durumda, sihirli bir mermi sadece bir girdiyi kendinizi santise zorunda var. Denemek ve kötü karakterler filtre eğer kesinlikle başarısız olur. Bir beyaz liste yaklaşım ve sadece iyi karakter geçsin. Farklı vektörler olabilir nasıl örnekler için XSS cheat sheet Bak
HTML etiketleri dışında htmlspecialchars ($ string) kullansanız bile, hala çok bayt charset saldırı vektörleri açıktır.
Eğer olabilir en etkili şöyle mb_convert_encoding ve htmlentities bir arada kullanmaktır.
$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');
$str = htmlentities($str, ENT_QUOTES, 'UTF-8');
Hatta bu çünkü UTF kolları şekilde, IE6 savunmasız bırakır. IE6 kullanım düşüyor kadar Ancak, bu tür ISO-8859-1 olarak daha sınırlı bir kodlama, geri düşebilir.