Bu geçerlilik onay savunmasız mı?

5 Cevap php

Ben GET isteği ile diğer dosyaları içeren bir sayfada bu kodu vardır:

$page = strtolower($_GET['page']);

if(!$page or !$allow[$page] or $page == 'home') {
    header("Location: home.php");
}

$allow dahil edilecek geçerli dosyalar izin dizeleri bir listesini içeren bir kodlanmış bir dizi olduğu. Bazı kod enjeksiyonu sağlayacak veya bu yeterince iyi check belirgin bir şey eksik?

5 Cevap

Bu register_globals $ üzerine yazılmasına izin izin vermediği sürece savunmasız değil.

Bu olsa bildirimleri atmak olacaktır, ve ben şahsen dava-duyarsızlık olmazdı, yani ben böyle yapardım:

if (empty($_GET['page']) || empty($allow[$_GET['page']]) || ($_GET['page'] == 'home'))
{
    // Technically a header location should be a complete URL - http://...
    header("Location: home.php");
    exit();
}

Ok gibi görünüyor. Sadece emin header () başarısız olsa bile, script sona emin olmak için bir çıkış (başlığından sonra) deyimi () ekleyin.

Bu yeterli olacaktır

 $allow = array('home', 'another_one', 'blah');
 $page = isset($_GET['page']) ? $_GET['page'] : 'home';
 if(in_array($page, $allow, true))
     include "$page.php";

Orada "başlığını" kullanıyorsanız neden emin değilim

"Yeterince iyi" çok geniş bir fırça. Biraz genişletebilirsiniz? Eğer $ _GET ['sayfa'] biliyorsun da, o bir regex verileri doğrulamak için asla acıyor değerleri (örneğin, tamsayı, ya da sadece küçük harfleri, vesaire içeren tanımlayıcıları) küçük bir kümesine sınırlı olmalıdır.

$ sayfanın içeriği uygun değilse o daha önce kontrol geçirilen edilebilir ne dezenfekte kriterlerini karşılayan sağlamak için öncelikle $ sayfada bir regex yapmak daha iyi olabilir, daha sonra işlemek bilmiyorum ...