0

私は現在リンクを取得しようとしています:

  <a href='?p=bid?Sale_ID=$Sale_ID'>BID</a>

動作しますが、「要求しているページは存在しません」というメッセージが表示され続けます。このリンクを使用すると、このページは動作します。

  <a href='include/bid.php?Sale_ID=$Sale_ID'>BID</a>

これにより、私の問題は、リンクにページを含めるために使用しているissetimにあると私は信じています。

  <?php
  if (isset($_GET['p']) && $_GET['p'] != "") {
  $p = $_GET['p'];
  if (file_exists('include/'.$p.'.php')) {
  @include ('include/'.$p.'.php');
  } elseif (!file_exists('include/'.$p.'.php')) {
  echo 'Page you are requesting doesn´t exist<br><br>';
  }
  } else {
  @include ('include/login-form.php');
  }
  ?>

私は、pをqに置き換えて、別のissetを追加しようとしました。これは、ページを破棄するだけです。

だから私の質問は、これを回避する方法はありますか?

ありがとう

4

4 に答える 4

3

ここには2つの疑問符があります。

?p=bid?Sale_ID=$Sale_ID

複数のクエリ文字列パラメータはアンパサンドで区切られます。

?p=bid&Sale_ID=$Sale_ID

于 2012-08-16T18:06:23.827 に答える
1

表示するクエリ文字列:?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

攻撃者はこの方法を使用して、公開したくないファイルの内容を出力する可能性があります。ファイルを含めてブラインドする前に、この変数の値をより注意深くチェックしていることを確認してください。

また、エラーサプレッサー()を使用しないように警告したいと思います@。エラーはあなたの友達です!コードで何が起こっているのかを正確に知りたい場合は、エラーサプレッサーを使用すると、重大な問題が発生するのを防ぐことができます。本当に-決して、エラーサプレッサーを使用することはありません。の代わりに@includeinclude

私はこのようなものをもっと提案します:

$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');

コードの最初の部分は、クエリ文字列値が存在し、コンテンツが含まれていることを確認します。次に、英数字以外の文字をすべて削除します(これにより、悪用を防ぐことができます)。次に、それが存在するかどうかを確認し、その結果を変数に格納して、再度使用できるようにします。

ページが存在する場合、ファイルが含まれます。そうでない場合は、「ページが見つかりません」というメッセージが出力され、ログインフォームファイルが含まれます。クエリ文字列にページが指定されていない場合は、ログインフォームファイルが含まれます。

ドキュメンテーション

于 2012-08-16T18:07:50.163 に答える
0

?p = bidは、デフォルトのファイル(通常はindex.php)に「リダイレクト」します。あなたはそれがbid.phpで機能することを望みます。

次のコマンドを使用して、apacheのデフォルトファイルを設定できます。 DirectoryIndex index.php bid.php

他の問題はあなたが複数を使用することです?兆候。

?p=bid&Sale_ID=$Sale_IDはるかにうまくいくだろう

于 2012-08-16T18:05:21.770 に答える
0

file_existsはインクルードパスを使用しないため、次のようにする必要があることに注意してください。

if (file_exists( get_include_path() . 'include/'.$p.'.php')) {

詳細: http ://ca2.php.net/manual/en/function.file-exists.php

于 2012-08-16T18:07:17.607 に答える