Realpath güvenli?

7 Cevap php
<?php
if (preg_match('/^[a-z0-9]+$/', $_GET['p'])) {
$page = realpath('pages/'.$_GET['p'].'.php');
$tpl = realpath('templates/'.$_GET['p'].'.html');
if ($page && $tpl) {
    include $page;
    include $tpl;
} else {
    include('error.php');
}
}
?>

Bunu ne kadar güvenli söyleyebilirim?

7 Cevap

Ben bir şablon dosyası için kullanabilirsiniz, böylece yerine (sizin al) fonksiyonları / dizeleri / switch-olgu / elseif ton ile tek bir dosya dağınıklığı ya da aynı düzeni ile dosyaları ton oluşturmak zorunda "sayfalar" içerebilir.

Bu dizinin realpath olması ve dosyanın realpath içeren dizin ile başlarsa, dahil edilecek dosyanın realpath gerektiğini içeren denetler, o dahil olmak üzere izin verilir.

<?
#If you're worried about funky characters messing with stuff, use this
#preg_replace("/[^A-Za-z0-9_\-]+/","",$str);

if (isset($_REQUEST['page'])) {
    $path=realpath("../inc/page").DIRECTORY_SEPARATOR;
    $full_page=realpath($path.$_REQUEST['page'].".php");
    if (file_exists($full_page)&&(strpos($full_page,$path)===0)) {
        include($full_page);
    } else {
        echo "FAILED";
    }
}
?>

include olursa olsun realpath'd olup olmadığını veya orijinal akrabası, aynı dosyaya sayfa yolunu çözmek gibi realpath, bu durumda size yardımcı olmuyor. Bu geçerli olmak üzere 'görünüyor' ama ben şahsen o kod parçasını güven olmaz. Birisi dize fesih tozu dumana katıyor, girişine bir boş karakter enjekte etmek için düzgün bir yol rakamlar eminim.

Eğer güvenli olması için, yerine yapmanız gereken şey, (daha iyi uyacak olursa, ya da kara liste, ancak beyaz listeler tercih) bir beyaz tutmak tüm izin girişler / sayfaları olduğunu.

Bu güvenli görünüyor ....

But not efficient. In MVC you have the controller and view dirs preset and pre known. No point in doing a stat to check if view/controller exists.

realpath() will actually have some effect in this case as it'll return FALSE hedef dosya çıkar yapmazsa. Ama diğer posterler gibi zaten dedi - Bu kod herhangi bir güvenlik eklemek olmaz.

Bu belirlenen dosyalar yoktur durum oldukça hata işleme bir yoldur.

$ _GET ['P'] Better run basename (). Herhalde hiçbir dizin geçişi saldırılar.

Ben PHP realpath üzerine yorum yapamam, ama bu sistemin realpath işlevi için sadece bir sarıcı ise o zaman bir şey farkında olmak: realpath yürütülürken işlem bir sinyal alırsa bazı sistemlerde (örneğin, Solaris), bir dönersiniz , kodunuzu sağlamak zorundayız durumda boş dize ... (PHP uygulama sizin için belirli ikilem giderir sürece) durum bu tür işlemek için kurulumudur