最近、自分のサイトのお問い合わせフォームを悪用しようとする試みがあったことを心配して、クライアントから連絡がありました。どうやら、誰かがメッセージ フィールドに何らかのコードを書き込もうとしたようです。おそらく、スパム メールの目的でバックエンド スクリプトを使用しようとしたものでした (ファンキーなヘッダーを使用したメール インジェクション)。
現在、適切なセキュリティは、送信前にフォームを検証する 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']);
何度も書く代わりに、単純な関数または私のための仕事。
助けてくれてありがとう、良い一日を!