0

これまでファイルブラウザを構築しましたが、かなり安全ではありません。たとえば、「?dir=../」または「?dir=../../../」を挿入すると、表示できないはずのファイルを表示できます。私のコード:

<?php
    if(isset($_GET['dir']) && $_GET['dir'] !== "../") {$dir = $basedir.$_GET['dir']."/";} else {$dir = $basedir;}
    if ($handle = opendir($dir)) {
        if(isset($_GET['dir']) && $_GET['dir'] !== "") {echo "<a href='?dir='>back to root</a>";}
        while (false !== ($file = readdir($handle))) {
            if ($file != "." && $file != "..") {
                if(filetype($dir . $file) == "file") {$filetype = what_suffix($file);} else {$filetype = "-";}
                if(filetype($dir . $file) == "file") {$filesize = round( filesize($dir . $file)/1024/1024 ,2)." MB";} else {$filesize = "-";}
                if(filetype($dir . $file) == "file") {$filedate = date("d.m.Y H:i:s", filectime($dir.$file));} else {$filedate = "-";}
                if(filetype($dir . $file) == "file") {
                echo(
                    "<tr>
                        <td><a href='?dir=".@$_GET['dir']."&file=".$file."'>".$file."</td>
                        <td>".$filetype."</td>
                        <td>".$filesize."</td>
                        <td>".$filedate."</td>
                    </tr>"
                ); } else {
                echo(
                    "<tr>
                        <td><a href='?dir=".@$_GET['dir']."/".$file."'>".$file."</td>
                        <td>-</td>
                        <td>-</td>
                        <td>-</td>
                    </tr>"
                ); }


            }
        }
        closedir($handle);
    }
?>

それを制限する方法はありますか?(木を見て木を見ていないだけだと思います)

4

1 に答える 1

1

これは、私がそのようなことに使用した基本的なセキュリティチェックです。

function isSecurityViolation($dir) {
    if (preg_match('#https?://#i', $dir)) {
        return true;
    }

    // no directory traversal attempts
    if (strpos($dir, '../') !== false) {
        return true;
    }

    if (strpos($dir, "\x00") !== false) {
        return true;
    }

    if (strpos($dir, '%00') !== false) {
        return true;
    }

    return false;
}

次の違反をチェックします。

  • http または https URL を開こうとしている
  • を使用したディレクトリトラバーサル..
  • 悪意のある URL が特定の機能を通過できるようにするヌル文字チェック

スクリプトの最初のどこかで、次のように呼び出すことができます。

if (isSecurityViolation($dir)) {
    die('No soup for you.');
}
于 2012-05-27T18:29:59.063 に答える