2012-04-04 3 views
1

私はPHPを介してアクセスしたい私のフォームにこの選択入力を持っています。これは、PHPのselect要素からオプションにアクセスする信頼できる方法ですか?

<div data-role='fieldcontain'> 
    <label for='fruits' class='select'>Favorite Fruits</label> 
    <select name='fruits[]' id='fruits' multiple='multiple' data-native-menu='false'> 
     <option value=''>Favorite Fruits</option> 
     <option value='1' selected='selected'>Apple</option> 
     <option value='2' selected='selected'>Banana</option> 
     <option value='3' selected='selected'>Cherry</option> 
    </select> 
</div> 

select要素に「果物[]」の名前を設定することにより、この作品:

// |$fruits| is an array 
$fruits = $_POST['fruits'] 

をしかし、私は、フォームからのデータのクリーニングが心配です。投稿データを配列に渡すのは安全ではないようです。例えば、誰かがselect要素をFirebug経由でテキスト入力要素に変更し、私のプログラムに悪意のあるコードを入力するとどうなるでしょうか?私は決してhtmlspecialcharsと呼んでいません。

私のセキュリティ上の懸念はありますか?なぜ、なぜそうではないのですか?

+1

はい、あなたの懸念事項は有効です。ユーザーの入力を信頼しないでください。ページに印刷する場合は、 'htmlspecialchars()'を使用してそれをサニタイズすることができます。DBに固執する場合は、mysql_real_escape_string()を使用するか、DBに相当するものを使用します(MySQLを使用しない場合)。編集:もちろん、あなたがやっていることは、データを配列に追加することです(クエリとして実行しないで、エコー:HTMLとして渡すか、 'eval'に渡すと、心配することはありません)。 – powerbuoy

+0

htmlspecialcharsが文字列を受け入れるので、私は直接 'htmlspecialchars'と呼ぶことはできません –

+1

すべての要素で' htmlspecialchars'を実行するにはどうすればいいですか? array_walk'を使用することができます:array_walk($ fruis、 'htmlspecialchars') '。 – powerbuoy

答えて

1

実際には有効ですが、データがユーザー入力からのものである場合は、最初にサニタイズする必要があります。

この場合、ユーザーは簡単にHTMLを破壊したり、さらに悪いことに悪意のあるXSS攻撃を注入することができます。

この場合、htmlspecialcharsで値をサニタイズする必要があります。


私はあなたがHTML入力タグにユーザー入力のオプションを入力していることを理解しましたが、そうではありません。 PHPはPOSTデータ内の文字列または配列のみを受け付けます。したがって、入ってくるデータが、あなたがやりたいことと互換性があることを確認する必要があります。一つの可能​​な解決策は、ホワイトリスト提出した値になり、array_intersectような機能は、例えば、ここで役に立つかもしれない:

$allowed_fruits = array('Apple', 'Banana', 'Cherry'); 
$fruits = array_intersect($allowed_fruits, $_POST['fruits']); 

この方法で、ユーザーはそれが$fruitsアレイ上で無視されます「イチゴ」を提出した場合。

あなたはまた、配列はこのように、多次元ではないことを確認することがあります

if (count($_POST['fruits']) != count($_POST['fruits'], COUNT_RECURSIVE)) 
{ 
    // array is multidimensional, do not process 
} 

このコースの、データの使用状況によって異なりますが、ホワイトリストのアプローチは、常に最もあります安全です。

1

あなたのコードは、(issetis_array、...)が適切にデータベースに送信する前にそれをエスケープするユーザ入力が予想される形式であるかどうかを検証し、HTML出力、どこ他のログ、しなければなりません。基本的に、ここでは、ユーザが入力した文字列とユーザが入力した文字列との間にはほとんど違いがない。

mysql_real_escape_string(またはそれ以上の場合はPDO)をデータベースとして使用するには、htmlspecialcharsをHTML出力で使用します。

1

これは値を取得する正しい方法ですが、心配するのは当然です。値を受け取ったら、適切な衛生手段を使います:表示するhtmlspecialchars、あなたのDBに挿入するmysql_escapeなどあなたの配列の各要素に対して行う必要がありますあなたはそれを使用するつもりです。