Codeworks Notes

 2021-08-17

 2021-08-19

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 );

これで日本語以外のメールがフォームを通らなくなります。