0

最近、自分のサイトのお問い合わせフォームを悪用しようとする試みがあったことを心配して、クライアントから連絡がありました。どうやら、誰かがメッセージ フィールドに何らかのコードを書き込もうとしたようです。おそらく、スパム メールの目的でバックエンド スクリプトを使用しようとしたものでした (ファンキーなヘッダーを使用したメール インジェクション)。

現在、適切なセキュリティは、送信前にフォームを検証する JavaScript ファイルです。バックエンドでのチェックは実際にはありません。

そのため、バックエンドにいくつかの検証を追加しました。次のような単純なものだけです。

 $namePattern = '/^[a-z0-9()\/\'":\*+|,.; \- !?&#$@]{2,75}$/i';
 $emailPattern = '/^[^@\s]+@([-a-z0-9]+\.)+[a-z]{2,}$/i';
 $phonePattern = '[0-9\.\-]';
 $array = $_POST;
 //This is the first line of defense.
 if (!preg_match ($namePattern, $array['c_firstname']){
    die ("Please go back and enter a correct first name");  
 }
 ...More if statements to check other fields. 
 //The second line of defense.
 function remove($name){
     return( str_ireplace(array( "\r", "\n", "%0a", "%0d", "Content-Type:", "bcc:","to:","cc:" ), " Something Replaced ", $name ) ); 
}
  $array['c_date'] = remove ($array['c_date']);
  //Check the rest of the array.

申し訳ありませんが、私のロジックや構文に何か問題がある場合は、上記を実際にはまだテストしていません (サイトが公開されているため、テストする前にできるだけ多くのコードを記述したかったのです)。

上記でセキュリティチェックは十分ですか?パターン チェックは正しく行われましたか (表記法を完全に理解していないため、ほとんどの場合、他の人のパターンをコピーしただけです)。

この特定のメール フォームは Zend Mail を使用しているため、理論的には、通常の PHP メールよりも少し安全だと思います。

また、これはそれほど重要ではありませんが、時間があれば、配列を循環して各要素に新しい値を割り当てる方法を教えてもらえますか (つまり、$array['c_date'] = remove ($array['c_date']);何度も書く代わりに、単純な関数または私のための仕事。

助けてくれてありがとう、良い一日を!

4

3 に答える 3

1

一般的に言えば、重要なのは、ユーザー入力から来るものはすべて実行されないようにすることです。電子メールを生成するコードを提供すると、すべてのユーザー入力がエンコードされます。問題はそれほど多くありません。

パターン マッチングの入力が問題になることはありません (特に、ユーザーが html コードなどの特定の値を入力できるようにしたい場合を除きます)。

個人的には、フォームに挿入されたスクリプト/コードは実行されず、実行されない限り害はないことをクライアントに再保証します。

于 2011-10-03T18:39:02.803 に答える
1

入力を適切にサニタイズするだけで十分です。htmlspecialchars()またはを使用htmlentities()します。 < または > 文字を取り除くこともできます。これで十分です。

于 2011-10-03T18:40:07.403 に答える
1

メール フォームで最も頻繁に発生する問題は、Web 上に横たわる悪いコード サンプルから発生します。このサンプルでは、​​送信先の電子メールがフォームの非表示フィールドから取得されます。これにより、攻撃者はその電子メールを置き換え、サーバーをスパム ハブとして使用できます。

電子メールがユーザー入力を受信しないことを確認してください。それ以外の場合、起こりうる最悪の事態は、スパムを受信することです。とにかく、人々に連絡してもらいたい場合にのみ起こります.

于 2011-10-04T13:13:27.753 に答える