経緯
お問い合わせフォームから、毎日何十通も「〇〇導入しませんか?」系の営業目的のメールが飛んでくるようになる。
GAの目標設定に影響が出るし、注目しないといけない正規の問い合わせが埋もれやすくなるので、「明らかに営業目的なメールは問い合わせを送信できないようにしてほしい」と依頼がくる
対応方法検討
サイトで使用しているa-blog cmsでは、管理画面のフォーム設定で正規表現を使用した入力チェックが使えるので、エラーにしたいワードを正規表現で禁止にすれば良さそう。
正規表現での対応
指定した単語を含まない
^(?!.単語A).$
指定した単語のいずれも含まない
^(?!.*(単語A|単語B|単語C|単語D)).*$
対応検証
ひとまず下記の文言をエラーに設定して試す。
^(?!.*(のご案内をさせて|サービスのご提案|参加費)).*$
管理画面での設定変更
管理画面の「サイト管理」の「フォーム」から進んで該当フォームの「変更」から設定する。
フィールドにtextareaのnameを、オプションに「正規表現マッチ」を、値にエラーにしたい正規表現の値を設定する。
^(?!.*(のご案内をさせて|サービスのご提案|参加費)).*$
つまづき
この段階でフォームを試すと、設定した単語が含まれて無くても改行が含まれるとエラーになってしまう。
正規表現でいろいろ試してみるも、正規表現そのものへの理解が浅いこともあり解決できず・・・・。
修正
フォーム送信直前にtextareaからinput hiddenに値をセットし直し、その値で正規表現チェックをかければ改行を考えなくて良くなると考えて検証。
フォームのコード
<form action="" method="post" enctype="multipart/form-data" onSubmit="setHiddenText();">
-------(中略)------
<textarea id="contact_text" name="contact_text">\{contact_text\}</textarea>
<input type="hidden" name="field[]" value="contact_text">
<input type="hidden" name="contact_text:v#required">
<input type="hidden" id="contact_text_hidden" name="contact_text_hidden" value="">
<input type="hidden" name="field[]" value="contact_text_hidden">
-------(中略)------
</form>
<script>
function setHiddenText() {
let val = $('#contact_text').val();
val = val.replace(/\r?\n/g,"");
$('#contact_text_hidden').val(val);
}
</script>
※該当の正規表現チェックの際、エラーメッセージは出さないようにしています。
管理画面での設定変更
正規表現チェックのフィールドの値を「contact_text」から「contact_text_hidden」へ変更する。
成功!
上のコードと管理画面の設定変更で意図した挙動になる。
(改行OKで指定したワードのいずれかが含まれていたらエラーにする)
単語については管理画面から設定ができるため、エンジニアでなくても追加・削除が可能になっています。
備考
もっと簡単にスパム対策する方法あるかもしれないです。