1

PHP経由でアクセスしたいフォームにこの選択入力があります。

<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[]」に設定すると、次のように動作します。

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

ただし、フォームからデータを消去することについて懸念があります。投稿データを配列にフィードするのは安全ではないように思えます。たとえば、誰かが Firebug を介して select 要素をテキスト入力要素に変更し、悪意のあるコードをプログラムに入力した場合はどうなるでしょうか? 私は決して電話しませんhtmlspecialchars

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

4

3 に答える 3

1

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

データベースを操作したり、HTML 出力を操作したりするには、 を使用しますmysql_real_escape_string(またはさらに良い方法)。PDOhtmlspecialchars

于 2012-04-04T06:17:30.800 に答える
1

これは値を取得する正しい方法ですが、心配するのは当然です。提案した方法で値を受け取り、適切なサニテーション方法を使用します。表示には htmlspecialchars、DB に挿入するには mysql_escape などです。配列内の各要素に対してそれを行う必要がありますが、そのときだけです。あなたはそれを使うつもりです。

于 2012-04-04T06:17:33.133 に答える
1

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

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

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


気にしないでください。ユーザー入力からのオプションを HTML select タグに入力していることは理解しましたが、そうではありません。PHP は POST データ内の文字列または配列のみを受け入れるため、受信するデータが目的のデータと互換性があることを確認する必要があります。考えられる解決策の 1 つは、送信された値をホワイトリストに登録する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
}

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

于 2012-04-04T06:16:13.547 に答える