2009-08-21 16 views
0

私は潜在的なセキュリティ問題を開かないような方法でパラメータを取得しようとしています。

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

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

はこれで十分ですか更なるステップが必要なのでしょうか。

答えて

5

あなたの言うことは安全ですが、あまりにも冗長です。あなたは多くの大として(あなたのためにそれを処理する関数には、この抽象的、でき

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

スーパーグローバル解析のこの種は、あなたのコード全体で共通である場合:PHPの配列操作を使用してPHPは、あなたのために汚い仕事を処理させるだろうPHPプロジェクトが行う)。


ギャビンが指摘したように、それはすべての可能であればあなたは(すなわち$_GET$_POST、または$_COOKIE)に興味を持っている特定のスーパーグローバルを使用することもお勧めします。今のところ重要ではないかもしれませんが、いくつかの醜いバグは、3つの超大域間で命名の競合が起こることを管理できます(例::$_COOKIEはデフォルトの検索結果の並べ替えを参照することがあります)。$_GETsortは昇順または降順です。

+1

$ _REQUEST ['media']が設定されていない場合はE_NOTICEをスローします。まだisset($ _REQUEST ['media'])をテストする必要があります。 – gnarf

+0

OK。質問に答えてくれてありがとう、なぜリクエストの代わりに$ _GETを使うべきかについての説明。 –

+0

非常に良い点ガナフ - 私はそれを考慮していませんでした。元の投稿を正しいものに編集しました。 –

1

私は1つ以上の条件を追加します。

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

そして、はい、$ _REQUESTスーパーグローバルは、リクエストを読むために推奨される方法です。

+1

または 'array_key_exists'の代わりに' isset($ _ REQUEST ['media']) 'また、デフォルトの$ sortで" both "を開始するのはなぜですか? – gnarf

+0

良いアイデア、変更! –

+0

これは最も読みやすい方法ですので、おそらく私が使用する方法です。 –

5

データがどこから来ているのかわからないことはかなり安全ではないことに気付く価値があります(セキュリティについて懸念している場合)。配送方法によって$ _GET、$ _POST、$ _SESSIONのいずれかを使用してください。

+0

良いキャッチ。誰かがそれに気づくだろうと思ったが、重要かどうかはわからなかった。 –

1

最も簡単な方法は、次のようになります。

$sort='both'; 
$sort_valid = array('video', 'audio'); 
if(isset($_REQUEST['media']) && in_array($_REQUEST['media'], $sort_valid)) $sort=$_REQUEST['media']; 
1
$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); 
+0

クローズドパレンズがあります)がありません。関数はありませんarray_key_intersect() - 代わりにarray_intersect_assoc()を使います。 misnamed:default!= defaults ---すべてのデフォルトが分かっていると仮定します(例えば、正規表現の規則はありません) – knb

1

は、データから来ていることは最良の方法ですあなたが知っていることを確認してください。
//我々はそれが文字列に解析しません//
、そうwhateeverは$ _POSTに来て、我々は方法がポストに等しいならば、我々はint型に解析するメディアヌル
// $を設定し、GETメソッドを受け入れるドントので、私たちはsql injcetionをチェックする必要はありません。道による

(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; 
} 



、あなたは私たちが、フォームでPOSTメソッドを使用しての約$ _SERVER [ 'REQUEST_METHOD']

//を読むことができます...

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