0
<?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');
}
}
?>

これはどれくらい安全だと思いますか?

4

7 に答える 7

2

私はこれをテンプレートファイルに使用しているので、大量の関数/文字列/スイッチケース/elseifs (選択してください) で単一のファイルを乱雑にしたり、同じレイアウトで大量のファイルを作成したりする代わりに、「ページ」を含めることができます。

インクルードするディレクトリの実パスと、インクルードするファイルの実パスをチェックします。ファイルの実パスがインクルード ディレクトリで始まる場合、インクルードが許可されます。

<?
#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";
    }
}
?>
于 2012-09-11T00:07:40.697 に答える
0

PHPのrealpathについてコメントすることはできませんが、それがシステムのrealpath関数の単なるラッパーである場合は、注意すべきことが1つあります。一部のシステム(Solarisなど)では、realpathの実行中にプロセスがシグナルを受信すると、空の文字列...この場合、コードがそのタイプの状況を処理するように設定されていることを確認する必要があります(PHP実装がその特定のジレンマを解決しない限り)

于 2013-02-27T22:12:02.927 に答える
0

この場合、realpathincludeは、ページパスを同じファイルに解決できるため、実際のパスであるか元の相対パスであるかに関係なく、役に立ちません。それは「有効であるように思われる」が、私はそのコードを個人的には信用しないだろう。誰かが入力にヌル文字を挿入するためのきちんとした方法を考え出し、文字列の終了に大混乱をもたらすと確信しています。

安全のために、代わりに行う必要があるのは、許可されているすべての入力/ページのホワイトリスト(または、より適切な場合はブラックリストですが、ホワイトリストを優先する場合)を保持することです。

于 2009-03-28T14:11:01.333 に答える
0

安全なようです…。

しかし、効率的ではありません。MVCには、コントローラーとビューdirが事前設定されており、事前に知られています。ビュー/コントローラーが存在するかどうかを確認するために統計を実行しても意味がありません。

于 2009-03-28T14:19:07.350 に答える
0

realpath() will actually have some effect in this case as it'll return FALSE if the target file does not exits. But as the other posters already said - this will not add any security to the code.

It's rather a way of error-handling in case the designated files do not exist.

于 2009-03-29T10:40:22.080 に答える
0

$_GET['p'] で basename() を実行することをお勧めします。確かにディレクトリトラバーサル攻撃はありません。

于 2009-04-03T09:34:40.303 に答える