質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • JavaScript

    17465questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • HTML

    9530questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • jQuery

    7091questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

フォームからのスパム対策で最も効果的な方法とは

解決済

回答 5

投稿

  • 評価
  • クリップ 1
  • VIEW 2,895

teratail_siw

score 13

とあるページに設置されたメールフォームに、毎日のようにスパムメールが送信されてきます。
フォームの構成は仮に下記とします。

・メールアドレス入力欄(入力必須)
・メッセージ入力欄
・プライバシーポリシー同意チェックボックス(入力必須)

スパムメールをなくすための方法として、下記のうち最も効果があると思われるのはどれでしょうか。
今回はHTML、JavaScriptで対応できる方法のみとします。

  1. formタグをHTMLに記述しない
    チェックボックスにチェックを入れるとformタグが付与されるようにする

  2. 送信ボタン(submitタグ)をHTMLに記述しない
    チェックボックスにチェックを入れると送信ボタンのHTMLが付与されるようにする

  3. 送信ボタン(submitタグ)をデフォルトでdisabledにする
    チェックボックスにチェックを入れると送信ボタンのdisabledが解除されるようにする

スパムロボットはJavaScriptを読んでいないと仮定すると、1、2に関してはチェックを入れなくてもJavaScriptでHTMLを付与すれば効果は変わらないような気がしますがどうでしょうか。

これら以外にも効果的な方法があればぜひ伺いたいです。
画像認証など、ユーザーの手間を増やす方法は除外します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+4

googleのrecaptchaが手軽で良いのではないでしょうか?
押すだけなので離脱も避けられます。

https://syncer.jp/how-to-introduction-recaptcha

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/07 11:37

    早速のご回答ありがとうございます。
    有効な方法だとは思いますが、今回は(ごく僅かであっても)ユーザーの手間を増やす方法は除外させてください。

    キャンセル

  • 2017/09/07 18:49 編集

    横からですが、念のため、要件を確認させて下さい。

    > 今回は(ごく僅かであっても)ユーザーの手間を増やす方法は除外させてください。
    質問文にある3つの対策は全てチェックボックスにチェックを入れることでform要素が活性化されるものです。
    そして、tesopgmhさんが提案されているreCAPTCHAもチェックボックスにチェックを入れることを求める仕組みです。
    私には両者の手間は変わらないように思えるのですが…。

    また、質問文にあるチェックボックスにチェックを入れる行為はごく僅かながらユーザの手間を増やしている事になるのてはないでしょうか。

    キャンセル

  • 2017/09/07 19:09

    質問欄で「チェックボックスにチェックを入れると」と書いたのが誤解を生む要因でした。
    申し訳ありません。
    正しくは「プライバシーポリシー同意のチェックボックスにチェックを入れると」です。

    formを活性化させるためだけに別途チェックボックスを設置することはNGですが、あらかじめ設置されたプライバシーポリシー同意のチェックボックスをform活性化に利用すれば手間が増えることにはならないと考えました。

    ご回答ありがとうございました。

    キャンセル

+3

今回はHTML、JavaScriptで対応できる方法のみとします。

状況にもよりますが、サーバサイドを変えない条件では気休めにしかならない可能性もそれなりにあります。

たとえば、CSRFトークンもないようなフォームだと、特定のURLにPOSTするだけでメール配信できる、ということになります。HTMLやJavaScriptで工夫しても「POSTするURLをわかりにくくする」以上の効果はないので、それがわかってしまえば一巻の終わりです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/07 18:59

    >気休めにしかならない
    確かにそうですね。
    JavaScriptだけの対策では限界があることを確認できただけでも大変参考になりました。
    貴重なアドバイスありがとうございました。

    キャンセル

checkベストアンサー

+2

敵(スパムロボット)の正体が分かっていないので回答としては「やってみないと分からない」と思います
ご質問にあった「JavaScriptを読んでいないと仮定する」というのがそもそも間違っている場合はjavascriptを使った対策をしても意味を成しません。ヘッドレスブラウザーを使ってプログラミングすればJavascriptを処理してスパムメールを送ることは可能ですから。

つまり、ご質問の対策をやってみて、スパムがなくなるようであれば
敵(スパムロボット)はJavascriptを処理できないロボットなので効果があるということになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/07 19:01

    JavaScriptでの対策は、スパムロボットがJavaScriptを読んでいない場合に限る。
    ということですね。大変参考になりました。
    貴重なアドバイスありがとうございました。

    キャンセル

+2

メールフォームに、毎日のようにスパムメールが送信されてきます

フォームから送られてきているとは限らないのでは?
もしformのactionにmailtoを入れているのであれば
メールアドレスをネットに晒しているわけですから
スパムは避けられないでしょう

考え方を変えれば、gmailなどスパムをフィルタリングしてくれる
メールサービスを通して受け取るとかが妥当じゃないでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/07 11:41

    早速のご回答ありがとうございます。
    メールフォームから送信される自動返信メールを介してスパムが送られてきます。
    ロボットが自動的にフォームを送信しているようです。
    このようなスパムを排除する方法を模索しています。

    メールサービスのフィルタリングも効果的な方法ではありますが、
    今回はメールサービスのフィルタリングは対処方法から除外させてください。

    キャンセル

  • 2017/09/07 11:52

    メール自体を送っているのはサーバーサイドのプログラムということでしょうか?
    状況がよくわかりません

    キャンセル

  • 2017/09/07 12:00

    説明不足で申し訳ありません。
    メールを送信しているのはサーバサイドのプログラムです。
    問い合わせフォームプログラムをサーバに設置していまして、そのプログラムを介してメールが送られてきます。
    通常は人がフォーム内容を入力して送信ボタンを押すのですが、それと同様の行為をロボットが大量に行なっているようなイメージです。

    キャンセル

  • 2017/09/07 12:07 編集

    サーバーサイドのプログラム処理ならいくつかやりようはありそうですね
    たとえば
    ・ロボットはリファラをクリアしている可能性が高いのでリファラをチェックする
    ・REMOTE_ADDRなどユーザー情報をメールに付加するようにしてスパムについてはipアドレスでブラックリストを作成する
    (もしくは意図的にREMOTE_ADDR情報が削除されているものを排除する)
    ・UAをチェックして値がない場合は除外する
    (UAでホワイトリストを作るのはメンテが大変なのであるかないかくらいのチェックしかきびしい?)

    キャンセル

  • 2017/09/07 12:13

    サーバサイドでの処理のご提案ありがとうございます。
    せっかくご提案をいただいたのに申し訳ございませんが、質問欄にも記載させていただいた通り今回はHTML、JavaScriptで対応できる方法のみとさせてください。(サーバサイドのプログラムを変更できない事情がございます)

    キャンセル

  • 2017/09/07 12:18

    > 今回はHTML、JavaScriptで対応できる方法のみ
    そういえばそういう条件でしたね

    例えばこんなのはどうですか?
    読み込み時、フォームにactionを設定しない。
    読み込みの数秒後setTimeoutなどactionを設定してやる
    ロボットは基本的に読み込み時のactionを利用するでしょうから・・・

    ただ、ユーザーの利便性を考えると、javascriptを前提としたシステムは
    汎用的とは言えないので微妙ですね

    キャンセル

  • 2017/09/07 19:04

    >フォームにactionを設定しない
    試してみます。

    確かにおっしゃる通り、JavaScriptが必須になってしまうとユーザビリティにかけますね。
    その辺りも踏まえて対応方法を検討させていただきます。

    キャンセル

+1

スパムが顧客に迷惑を書けるものでなければ、単純にスパムとして扱えるシステムを利用するのが良い気がします。(スパムフィルタを通す等)

投稿を制限するのであれば、投稿を観察する必要があります。
・ロボットによるものである
・人が手作業でコピペ
・大量に届いて業務に支障がある
・少量だがウィルス等が添付されていて危ない
等々。

効いてくる対応策も全然別物になるので、まずはそこの整理かと思います。

あまり状況に関係なく効果的なのは
・ページを生成してから X 秒経たないと投稿を受け付けない
・特定の IP アドレスからの1日あたりの投稿数を制限
・特定文字列をフィルタ
・投稿ボタンや投稿確認ボタンをランダムに記載
あたりだと思いますが、ユーザに迷惑をかける可能性も有るので、慎重に選択する必要があります。

スパムってホントに面倒くさいですよね^^;

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/07 11:56

    早速のご回答ありがとうございます。
    スパムメールの内容は
    ・ロボットによるもの
    ・短時間に膨大な量のメッセージが届く
    というものです。

    >特定の IP アドレスからの1日あたりの投稿数を制限
    >特定文字列をフィルタ
    IPアドレス、文字列が毎回変わるためこちらの方法は断念します。

    >ページを生成してから X 秒経たないと投稿を受け付けない
    質問欄であげさせていただいた1~3の方法より効果は高いのでしょうか。

    >投稿ボタンや投稿確認ボタンをランダムに記載
    申し訳ありません。私の理解力不足で「ランダムに記載する」というのがどのようなことかわかりません。
    よろしければご解説いただけないでしょうか。

    キャンセル

  • 2017/09/07 12:11

    正直何を見て投稿しているかわからないので、効果は測定してみないと分かりません。

    > 質問欄であげさせていただいた1~3の方法より効果は高いのでしょうか。
    機械投稿であれば、画面上のボタンが押せようが押せまいがあんまり関係ありません。ソースを確認して、curl 等で直接 POST してくるので、サーバ側でフィルタする必要がありますが、そのフィルタ根拠として、「人らしからぬ動き」を検出し、排除するってことなので、ハマればかなりの効果が見込めます。

    > 投稿ボタンや投稿確認ボタンをランダムに記載
    view を切り替えて、投稿処理を複数システムにします。
    これは、スパム側がエラー処理をどのように行っているかによりますが、いくつかエラーを出せば、諦めてくれるようなシステムだと、それなりに効果ありです。

    あと、思いつきですが、CSRF token の名称をランダムにするのも良いかもしれないです。

    キャンセル

  • 2017/09/07 19:02

    色々と実例を挙げていただきましてありがとうございます。
    参考にさせていただきます。

    キャンセル

同じタグがついた質問を見る

  • JavaScript

    17465questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • HTML

    9530questions

    HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

  • jQuery

    7091questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。