Wordpress
functions.php
Contact Form 7 で外国語のメールを遮断する
最近ワイルドカードを使って社用アドレスのスパムメールを根こそぎ殲滅していたら、お問い合わせフォーム経由の外国語メールが増えてきた感があり、そろそろ対策しないとなあと思ったのでメモ。
Contact Form 7 の対策
対策 1. ひらがなを含むかチェック(ゆるめ)
考え方としては「本文にひらがなを含まないものを通さない」です。
Wordpress のプラグイン「 Contact Form 7 」が有効であれば、functions.php に以下のコードを追加します。
function wpcf7_validate_mb_char( $result, $tag ) {
$field_name = 'your-message'; // チェックしたいフォームフィールド名
$value = str_replace(array("\r", "\n", ' ', ' '), '', $_POST[$field_name]); //改行とスペースを取り除く
if (!empty($value)) {
if (!preg_match('/[ぁ-ん]/u', $value)) {
$result['valid'] = false;
$result['reason'] = array($field_name => '【エラー】メッセージを送信できません。');
}
}
return $result;
}
add_filter( 'wpcf7_validate', 'wpcf7_validate_mb_char', 10, 2 );
対策 2. 日本語が占める割合をチェック(きびしめ)
こちらは「本文にひらがなを含み、かつ本文に占める日本語の文字が指定割合以上なければ通さない」ルール。
$min_rate は 0 〜 100 の範囲で割合指定ができます。効果が薄い時はレートを上げてください。
function wpcf7_validate_mb_char( $result, $tag ) {
$field_name = 'your-message'; // チェックしたいフォームフィールド名
$value = str_replace(array("\r", "\n", ' ', ' '), '', $_POST[$field_name]); // 改行とスペースを取り除く
$min_rate = 30; //(%)最小日本語文字数の割合(これ以上でなければエラー)
$str_l = mb_strlen($value , "UTF-8"); // 文字数取得(ダブルクオーテーション必須)
$str_ja = preg_match_all("/[ぁ-んァ-ヶー一-龠0-9、。]/u", $value, $matches); // 日本語の文字数を取得
$str_mb_rate = ($str_ja / $str_l) * 100; // 日本語文字数の割合を計算
if (!empty($value)) {
// ひらがなを含まなければfalseを返す
if (!preg_match('/[ぁ-ん]/u', $value)) {
$result['valid'] = false;
$result['reason'] = array($field_name => '【エラー】メッセージを送信できません。');
}
// 指定割合以上の日本語を含んでいなければfalseを返す
if ($str_mb_rate < $min_rate) {
$result['valid'] = false;
$result['reason'] = array($field_name => '【エラー】メッセージを送信できません。');
}
}
// いずれの条件もクリアできていたら本文を戻り値に返す
return $result;
}
add_filter( 'wpcf7_validate', 'wpcf7_validate_mb_char', 10, 2 );
これで日本語以外のメールがフォームを通らなくなります。