SORU
21 EYLÜL 2008, Pazar


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
21 EYLÜL 2008, Pazar


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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Edge-CGI 3D Tutorials and more!

    Edge-CGI 3D

    11 HAZİRAN 2013
  • George McCarron

    George McCar

    29 Mayıs 2013
  • Top Gear

    Top Gear

    27 Mart 2006