表示するクエリ文字列:?p=bid?Sale_ID=$Sale_IDが無効です。文字列を含むURLの構造は次のとおりです。
filename.extension?first_parameter=first_value&second_parameter=second_value
pしたがって、どのページを示したい場合は、次のようにします。
?p=bid&Sale_ID=$Sale_ID
..アンパサンド(&)を使用して、クエリ文字列値を区切ります。
また、ファイルを含めるために使用しているアプローチは安全ではないことに注意してください。これを送信した場合はどうなりますか?
?p=../../.htpasswd&Sale_ID=0
攻撃者はこの方法を使用して、公開したくないファイルの内容を出力する可能性があります。ファイルを含めてブラインドする前に、この変数の値をより注意深くチェックしていることを確認してください。
また、エラーサプレッサー()を使用しないように警告したいと思います@。エラーはあなたの友達です!コードで何が起こっているのかを正確に知りたい場合は、エラーサプレッサーを使用すると、重大な問題が発生するのを防ぐことができます。本当に-決して、エラーサプレッサーを使用することはありません。の代わりに@include、include
私はこのようなものをもっと提案します:
$file_exists = false;
$page = false;
if (
isset($_GET['p']) &&
strlen(trim($_GET['p'])) > 0
){
$page = preg_replace("/[^a-zA-Z0-9 ]/", "", $_GET['p']);
$page = str_replace(" ", "-", $page);
$file_exists = file_exists('include/'.$page.'.php');
if ($file_exists) {
include ('include/'.$page.'.php');
} else {
$page = false;
echo 'Page you are requesting doesn´t exist<br><br>';
}
}
if (!$file_exists ||$page === false)
include ('include/login-form.php');
コードの最初の部分は、クエリ文字列値が存在し、コンテンツが含まれていることを確認します。次に、英数字以外の文字をすべて削除します(これにより、悪用を防ぐことができます)。次に、それが存在するかどうかを確認し、その結果を変数に格納して、再度使用できるようにします。
ページが存在する場合、ファイルが含まれます。そうでない場合は、「ページが見つかりません」というメッセージが出力され、ログインフォームファイルが含まれます。クエリ文字列にページが指定されていない場合は、ログインフォームファイルが含まれます。
ドキュメンテーション