Htmlspecialchars ve mysql_real_escape_string benim PHP enjeksiyon kodu güvende tutmak?
Bugün bir soru input validation strategies in web apps ile ilgili soruldu.
Üst cevap yazma zamanda, PHP
htmlspecialchars
mysql_real_escape_string
kullanarak önerir.
Benim soru şudur: bu her zaman yeterli mi? Bilmemiz gereken daha fazla var mı? Nerede bu fonksiyonları yıkmak mı?
CEVAP
Veritabanı sorguları için geldiğinde, her zaman hazır ve parametrik bir sorgu kullanın. mysqli
PDO
kütüphaneler bu destek. Bu mysql_real_escape_string gibi kaçan işlevleri kullanarak daha kesinlikle güvenli.
Evet, mysql_real_escape_string etkili sadece dize kaçan bir fonksiyonudur. Sihirli bir değnek değildir. Yapacak tek bir sorgu dizesi kullanmak için güvenli olması için tehlikeli karakterler kaçış. Eğer girişler önceden sterilize yaparsan değil, ancak daha sonra bazı saldırı vektörleri karşı savunmasız olacaktır.
Aşağıdaki SQL düşünün:
$result = "SELECT fields FROM table WHERE id = ".mysql_real_escape_string($_POST['id']);
Bu istismar karşı savunmasız olduğunu görmek gerekir.
Hayal id
parametre yaygın saldırı yöntemi, bulunan:
1 OR 1=1
Düz kaçan filtreden geçecek kadar riskli bir karakter kodlamak için, orada yok. Bizi terk:
SELECT fields FROM table WHERE id= 1 OR 1=1
Güzel SQL enjeksiyon vektör ve saldırgan tüm satırları geri dönmek için izin verecek. Ya
1 or is_admin=1 order by id limit 1
üretir
SELECT fields FROM table WHERE id=1 or is_admin=1 order by id limit 1
Saldırganın tamamen kurgusal bu örnekte ilk yönetici detaylar dönmek için izin verir.
Bu işlevleri yararlıdır buna rağmen, dikkatli bir şekilde kullanılması gerekir. Tüm web girişler bir dereceye kadar doğrulanmış olduğundan emin olmak gerekir. Bu durumda, bir sayı olarak kullanarak, biz bir değişken sayısal olup olmadığını kontrol etmedik çünkü istismar olabiliriz. PHP yaygın olarak fonksiyonları bir dizi girdi tamsayılar, yüzer, alfanümerik vb kontrol etmek için kullanmalısınız. Ama SQL gelince, en hazırlıklı ifadesinin değeri dikkate alın. Yukarıdaki kod veritabanı fonksiyonları 1 OR 1=1
bir geçerli literal olmadığını bilirdi olarak hazırlanmış deyimi olsaydı güvenli olurdu.
Htmlspecialchars için. Bu kendi başına bir mayın tarlası.
Html ile ilgili farklı kaçan işlevleri bir bütün seçim ve işlevleri ne ki tam olarak net bir yönlendirme var bu PHP gerçek bir sorun yok.
Eğer bir HTML etiketi içine iseniz ilk olarak, gerçek sorun bulunmaktadır. Bak
echo '<img src= "' . htmlspecialchars($_GET['imagesrc']) . '" />';
Zaten bir HTML etiketi içinde miyiz, < ihtiyacımız yok; ya da >tehlikeli bir şey yapmak için. Bizim saldırı yöntemi sadece javascript:alert(document.cookie)
olabilir
Şimdi sonuç HTML gibi görünüyor
<img src= "javascript:alert(document.cookie)" />
Saldırı doğruca alır.
Daha da kötüye gidiyor. Neden? htmlspecialchars bu şekilde aradığında () çift tırnak kodlar çünkü tek değil. Eğer olsaydık
echo "<img src= '" . htmlspecialchars($_GET['imagesrc']) . ". />";
Kötü saldırgan şimdi yeni parametreleri enjekte tüm
pic.png' onclick='location.href=xxx' onmouseover='...
bize verir
<img src='pic.png' onclick='location.href=xxx' onmouseover='...' />
Bu durumda, sihirli mermi yok, sadece giriş kendini santise. Deneyin ve kötü karakterleri filtrelemek varsa kesinlikle başarısız olursun. Beyaz bir yaklaşım ve sadece iyi olan karakter. Farklı vektörler olabilir nasıl örnekler için XSS cheat sheet bak
Eğer htmlspecialchars kullanıyorsanız bile($string) HTML etiketleri dışında, hala multi-byte karakter kümesi saldırı vektörleri için size açıktır.
Olabileceğin en etkili şu şekilde mb_convert_encoding bir arada ve htmlentities kullanmaktır.
$str = mb_convert_encoding($str, 'UTF-8', 'UTF-8');
$str = htmlentities($str, ENT_QUOTES, 'UTF-8');
Hatta bu IE6 savunmasız bırakır, UTF işleme biçimi nedeniyle. Ancak, daha sınırlı bir kodlama, IE6 kullanımı düşüyor kadar-8859-1, ISO, gibi geri düşebilirsiniz.
Boş sorunlarına derinlemesine incelemek için bir daha, http://stackoverflow.com/a/12118602/1820 bkz
Nasıl benim PHP IDE Bağımlılık Enjeksi...
OAuth tüketici sırrı güvende tutmak iç...
Etrafta alır mysql_real_escape_string(...
Nasıl benim iPhone Objective-C kodu Uİ...
Kullanıyor .Benim C 4.0 Dizilerini NET...