2

私の上司は、PHP を介してフォームを処理し、結果を電子メールで送信するスクリプトを設定しました。このプロセッサを使用する必要があります。プロセッサの問題は、次のコード行です。

foreach ($_POST as $k => $v){$$k = strip_tags($v);}

送信されたすべての値が単なる文字列であればこれで問題ありませんが、配列として渡されるいくつかのチェックボックスを処理しようとしています。私が理解していることから、strip_tags 関数は文字列でのみ機能します。すべてを処理し、結果を電子メールで送信しますが、一連のチェックボックスを処理しようとするたびに通知をスローします。注意:配列から文字列への変換...プロセスは引き続き機能しますが、いたるところに醜い通知が表示されます。この問題を一時的に修正するために、strip_tags 関数を削除した結果、次のようになりました。

foreach ($_POST as $k => $v){$$k = $v;}

すべてが適切に機能するようになり、警告、エラー、または通知は表示されません。ただし、これを上司に指摘した後、元のコードに戻って、各チェックボックスに異なる値で同じ名前を付けるのではなく、それぞれに固有の名前を付けてほしいと言っています。私はそれを行うことができましたが、一連のチェックボックスを処理する適切な方法ではないことを知っています. さらに、あらゆる種類の頭痛を引き起こします。私の上司は、配列の操作方法をまったく理解していないため、配列に遭遇するたびに、このような愚かな回避策を考え出します。彼はまた、これがある種のスパム保護であり、人々が受信者をフォームに追加するのを阻止していると主張しています. 私は PHP の専門家ではないかもしれませんが、その記述が間違っていると確信しています。

では、この問題を解決するにはどうすればよいでしょうか? 最初にチェックボックス配列を文字列に変換してから、結果の文字列に対して strip_tags 関数を使用する必要があることはわかっていますが、私はまだ PHP にかなり慣れていないため、そのコード行が最初に何をしているのかを完全には理解していません。誰かが少なくとも私を正しい方向に向けるのを助けることができますか?

4

2 に答える 2

2

上司に次のことを指摘してください。

<input type="checkbox" name="valid_recipient[]" value="1" /> fred@example.com
<input type="checkbox" name="valid_recipient[]" value="x" /> nasty@badperson.com

<input type="checkbox" name="valid_recipient1" value="1" /> fred@example.com
<input type="checkbox" name="valid_recipient2" value="x" /> nasty@badperson.com

チェックボックス値の配列として渡されるか、個々のチェックボックス/値のペアとして渡されるかに関係なく、同じものです。いずれにせよ、Nasty 氏はあなたのチェックボックス リストに何かを挿入しただけです。

また、設定から悪意のあるユーザーとは

<input type="hidden" name="_POST" value="haha I wiped your post array!" />

フォームに。あなたのPHBの便利でダンディな「私たちを完全に安全にする」プロセッサは、「完全に安全」でありながら、$_POST配列を喜んで核攻撃しました

于 2011-03-01T19:20:11.070 に答える
0

チェックボックスを配列として渡すのはkushです:

<input type="checkbox" name="myarray[key1]" value="hello world" />
<input type="checkbox" name="myarray[key2]" value="well hello again" />

次のような結果の $_POST が作成されます。

Array
(
    [myarray] => Array
        (
            [key1] => hello world
            [key2] => well hello again
        )

)

これは素晴らしいことですが、上司のコードが二重に安全でないことも意味します。

まず、strip_tagsそこに がないと、XSS 攻撃に対して脆弱になります。

第二に、単純に変数名を信頼$_POSTし、それらをグローバル名前空間にエクスポートすることは、災害のレシピです。(register_globals が過去のものであるのには理由があります)。

たとえば、単純な$_SESSION変数を使用してログインしているユーザーのユーザー名を追跡するとします。このようなもの:

if ($_SESSION['logged_in_user'] == 'admin') {
   // do administrator things
}

変数を受け入れてエクスポートすることで$_POST、攻撃者は HTML フォーム要素を次のように変更できます。

<input type="checkbox" name="myarray[key1]" value="hello world" />

そして、それを次のようにいじります (Firebug または Chrome を使用):

<input type="checkbox" name="_SESSION[logged_in_user]" value="admin" />

ちょっと!匿名ユーザーは、Web サイトへの管理者アクセスを取得できます。

検討用の簡単なスクリプトを次に示します。

<pre>
<?php 
session_start();
$_SESSION['logged_in_user'] = 'pygorex1';
print_r($_SESSION);
foreach ($_POST as $k => $v) {
    $$k = $v;
}
?>
</pre>
<form method="post">
<input type="checkbox" name="myarray[key1]" value="hello world" />
<input type="checkbox" name="_SESSION[logged_in_user]" value="admin" />
<input type="submit" value="go go gadget" />
</form>
<pre>
<?php 
print_r($_SESSION);
print_r($myarray);
session_write_close();

if ($_SESSION['logged_in_user'] == 'admin') {
    echo("OWNED\n");
}

?>
</pre>
于 2011-03-01T19:42:28.953 に答える