Ajax Güvenlik Soru: JQuery ajax () + PHP scandir () = Güvenlik Sorunu?

2 Cevap php

Ben PHP güvenlik sorunları ile bir acemi değilim. Birisi benim koduyla bir güvenlik sorunu rapor, ama asla ayrıntılı bilgi verdi.

Aşağıdaki kod özet versiyonu. Ben PHP scandir () işlevi tarafından kullanılan sunucuya bazı veri göndermek için JQuery AJAX fonksiyonunu kullanıyorum.

Eğer herhangi bir güvenlik sorunları görüyor musunuz?

HTML Belge

 <script 
   src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js">
 </script>
 <script>
$.ajax({
    type: "POST",
    url: "example.php",
    cache: false,
    data: {
    	foo: "images",
    	bar: "something else",
            },
    success: function(html){
    alert(html);
    }
});
</script>

PHP Belge

<?php

$foo = filter_var($_POST["foo"], FILTER_SANITIZE_STRING);
$bar = filter_var($_POST["bar"], FILTER_SANITIZE_STRING);

$foo = scandir($foo);
$bar = (explode(",",$bar));

foreach ($foo as $a) {
    echo "<img src='$foo/$a'>";
}

?>

2 Cevap

Evet, makine üzerinde her dosya numaralandırabilmesidir. Ve muhtemelen sunucu üzerinden erişimi olan diğer makineler fopen wrappers. Bu bilgiler bana başka saldırılar hedef yardımcı olmak amacıyla, diğer savunmasız yazılımı çalıştıran veya hassas dosyaları belirlemenize yardımcı olabilir.

FILTER_SANITIZE_STRING yol referanslar dosya değil, HTML korumak için tasarlanmıştır, bu yüzden gerçekten burada size yardım edilmez. Bir arka uç işlevi kullanırken sadece oluşturulan HTML bir çıkış filtresi olarak kullanmanız gerekir.

Tehlikeli yolun kullanımlarını kısıtlamak istedikleri gibi belirteçleri: @, .., \ ve /. Ama Tom Haigh en örnek kodda olduğu gibi, güvenli düşünün karakterleri veya değerleri beyaz liste bunu.

Potansiyel 'foo' adlı kötü niyetli bir değer göndererek dosya sistemi üzerinde herhangi bir dosyaların bir listesini elde edebilir - bir değer '/' gönderildiğini eğer, HTML kaynağı kendi dosya sistemi kök tüm dosyaları görmek mümkün olacaktır. Bu her zaman için open_basedir kısıtlamaları gibi şeyler işe yaramayabilir, ama yine de iyi bir fikir değildir.

Olası bir çözüm ilk 'foo' parametresini sterilize olacaktır - örneğin Sadece bazı karakterler izin veya sadece örneğin izin dizin isimleri, beyaz liste içinde var 'foo' değerlere izin verebilir:

$foo = filter_var($_POST["foo"], FILTER_SANITIZE_STRING);

if (!in_array($foo, array('allowed_dir1', 'allowed_dir2'))) {
    //not valid, not in whitelist
}

//or

if (!preg_match('/^[a-zA-Z0-9+]+$/', $foo)) {
   //not valid, contains more than just letters and numbers
}