2011-03-01 9 views
2

私の上司は、PHPでフォームを処理して結果を電子メールで送信するスクリプトを設定しています。このプロセッサを使用するにはが必要ですです。プロセッサの問題は、このコード行です:送信されたすべての値が文字列だけだった場合、これは大丈夫だろう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にはまだ初心者です。誰かが少なくとも私を正しい方向に向けるのを助けることができますか?

+2

私は、変数の変数がさらに悪化見つける...あなたの現在の仕事を終了する –

+4

時間;)単一のコード行は、あなたの会社についてのすべてを伝えること。 – NikiC

+0

魔法の引用符の回り。それ以降は、すべてのタグを削除する必要はありません。 –

答えて

2

上司に指摘している:

<input type="checkbox" name="valid_recipient[]" value="1" /> [email protected] 
<input type="checkbox" name="valid_recipient[]" value="x" /> [email protected] 

<input type="checkbox" name="valid_recipient1" value="1" /> [email protected] 
<input type="checkbox" name="valid_recipient2" value="x" /> [email protected] 

それらは、チェックボックスの値、または個々のチェックボックス/値のペアの配列として渡されるかどうか、同じものです。いずれにせよ、Nasty氏はあなたのチェックボックスリストに何かを注入しました。

同様に、フォームに

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

を設定するから、悪意のあるユーザーは何です。

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

が結果を作成します。あなたのPHBの便利なダンディは配列としてチェックボックスを渡す

+1

+1) – NikiC

0

がクシュである「完全に安全」である全てながらプロセッサ楽しく、$ _POST配列を被爆ばかりしている「私たちは完全に安全になります」 $ _POSTのような:

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

) 

これは、それはまた、あなたの上司のコードが二重に安全であることを意味素晴らしいですが:

まず、を持っていませんは、XSS攻撃に対して脆弱になります。

第2に、単純に変数名を信頼し、それらをグローバル名前空間にエクスポートすることは災害のためのレシピです。 (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" /> 

Tad-ah!任意の匿名ユーザーは、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>