/* ページパスを定義します */ define("PAGE_DIR", "pages/"); if (file_exists(PAGE_DIR."$_GET[ページ].php")) include(PAGE_DIR."$_GET[ページ].php");
これはどれほど安全ですか?たとえば、ページが pages というフォルダにある場合、そのページを別の Web サーバーに含めることはできますか?
ありがとう
$_GET[page]
これはまったく安全ではありません。../../../somewhere/else/
許可されたページのリストを明示的に持つ必要があります。
編集:別のサーバーからのファイルを含めることはできないと思いますが、それでも良いことではありません。
サニタイズされていないユーザー入力をコマンド、特に include() のようなものに直接渡すことは決して良い習慣ではありません。基礎となる Web サーバー/OS が相対パスや拡張文字などをどのように処理するかは必ずしもわかりません。これらのいずれかが悪意を持って使用された場合、または別の方法で使用された場合、想定されていないものをユーザーに表示する可能性があります。見る。
考えられる悪用の 1 つ: ユーザーは、サーバー上の既知の場所にある悪意のあるスクリプトへの相対パスを渡します。http://webserver/yourscript.php?page=%2e%2e%2f%2e%2e%2f%2e%2e%2fhome/bad_user/evil_script
あなたの関数は pages/../../../home/bad_user/evil_script.php に変換できます。したがって、あなたの Web ページが提供されると、bad_user の php スクリプトを非常にうまく実行することができます。
少なくとも、$_GET['path'] を新しい変数に割り当て、addslashes() を指定する必要があります。
データを検証/サニタイズする前に $_GET または $_POST で何かを行うのは危険です。すべてのユーザーがあなたを捕まえようとしていると仮定し、データを使用する前にサニタイズします。