1

潜在的なセキュリティ問題が発生しないような方法でgetパラメータを読み取ろうとしています。

私が考えていたのは、リクエストパラメータを私が期待するものと明示的に一致させてから、一致しないものにはデフォルトを設定することでした。

例えば:

if ($_REQUEST['media'] == "video")
    $sort = "video";
elseif ($_REQUEST['media'] == "audio")
    $sort = "audio";
else
    $sort = "both";

これで十分ですか、それともさらに手順が必要ですか?

4

6 に答える 6

6

あなたが言及していることは安全ですが、過度に冗長です。PHP の配列操作を使用すると、PHP が面倒な作業を処理できるようになります。

$sort_valid = array('video', 'audio', 'both');
$sort = 'both'
if (isset($_REQUEST['media']) && in_array($_REQUEST['media'], $sort_valid)) {
    $sort = $_REQUEST['media'];
}

この種のスーパーグローバルな解析がコード全体で一般的である場合は、これを処理する関数に抽象化できます (多くの大規模な PHP プロジェクトがそうであるように)。


Gavin が指摘したように、可能であれば、関心のある特定のスーパーグローバル (つまり$_GET$_POST、または$_COOKIE) を使用することも良い考えです。今は重要ではないように思えるかもしれませんが、名前の競合が 3 つのスーパーグローバル間で発生することからいくつかの醜いバグが明らかになる可能性があります (たとえばsort、in$_COOKIEは検索結果のデフォルトの並べ替えを参照する場合がありますが、sortin$_GETは昇順または降順を参照します)。

于 2009-08-21T21:09:11.313 に答える
6

データがどこから来ているのかわからないのはかなり悪い習慣であることにも注意してください (セキュリティを心配している場合)。配信方法に応じて、おそらく $_GET、$_POST、または $_SESSION のいずれかを使用する必要があります。

于 2009-08-21T21:09:53.340 に答える
2

もう 1 つ条件を追加します。

    $sort = "both";
    if (array_key_exists('media', $_REQUEST))
    {
        if ($_REQUEST['media'] == "video")
            $sort = "video";
        elseif ($_REQUEST['media'] == "audio")
            $sort = "audio";
    }

はい、$_REQUEST スーパーグローバルは、リクエストを読み取るための推奨される方法です。

于 2009-08-21T21:07:07.120 に答える
2

最も簡単な方法は次のとおりです。

$sort='both';
$sort_valid = array('video', 'audio');
if(isset($_REQUEST['media']) && in_array($_REQUEST['media'], $sort_valid)) $sort=$_REQUEST['media'];
于 2009-08-21T21:11:39.937 に答える
2

データがどこから来ているのかが最善の方法であることを確認してください。
// GET メソッドを受け入れないので、$media null を設定します
// メソッドが post に等しい場合、int に解析します。したがって、$_post に何が入っても、
// 文字列モードでは解析されず、解析する必要はありませんSQLインジェクションをチェックしてください。

(isset($_GET['media']))? $media='': $media=(int)(isset($_POST['media'])) ? $_POST['media'] : '';

switch ($media) {
    case 1: $sort = "video"; break;
    case 2: $sort = "audio"; break;
    default: $sort = "both"; break;
}



ところで、$_SERVER['REQUEST_METHOD'] について読むことができます

// フォームで POST メソッドを使用するので...

if ($_SERVER['REQUEST_METHOD']=="GET") header('Location: http: //www.disney.com/ ');

于 2009-08-21T23:30:02.030 に答える
2
$valid = array("media" => array("both", "media", "video"), ... );
$default = array("media" => "both", ...);

...

// 1. drop invalid keys
$filtered_on_keys = array_key_intersect($_REQUEST, $valid);

// 2. drop invalid values
$filtered_on_values = array();

foreach($filtered_on_keys as $key => $value) {
  if (array_search($value, $_REQUEST($key) !== FALSE) {
    $filtered_on_values[$key] = $value;
  }
}

// 3. add missing defaults
$result = array_merge($defaults, $filtered_on_values);
于 2009-08-21T21:14:48.073 に答える