- 2009-03-25 水 17:33:28
- 今日の基礎体力
PHPの基礎体力掲示板の話です。
最近は UA に MRA 4.3 を含んだPOSTのアクセスが目立ちます。
多い日は1日250件くらいあります。
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 4.3
(build 01218))
MRA 4.3 ってなんでしょうね。まあ
スパム投稿のUAなんで気にすることもありませんが。
正規のフォームを介すことなく、
直接ターゲットの URL に POST しているので
ロボットによる自動投稿だと思われます。
ブラックリストをつくって、IPや投稿内容でフィルタリングしてはいますが
新らしいHOSTやパターンが現れると、その度に
投稿を削除して、リストを更新してとかなり面倒です。
新規投稿以外は、Javascriptでフォームを表示してるおかげで
スパム投稿はまったくありません。
アホなロボットがJavascriptを解釈してまで
投稿してこないだろうと読んだのは正解でした。
新規投稿についてもJavascriptで対策できそうだなと思い
試したところかなり効果があったので紹介します。
要点は、フォームの action にダミーの URL を指定しておき、
送信直前に DOM で action を正しいURLに書き換えるわけです。
これで正規のフォームからの投稿だけが受け付けられます。
フォーム側はこんな感じ。加えて下のJavascriptをロードしておきます。
<form id="postForm" method="post" action="/badPost" onSubmit="return validateForm()"> * * この /badPost はダミー * </form>
post.js (prototype.jsを使ってます)
function validateForm() { // フォームの送信先を正規のURLに変えます。 $('postForm').action = '/post'; return true; }
ダミーの /badPost ですが、実際は
ブラックリストを更新するスクリプトにしておきます。
人の目で post.js を見て投稿先URLを変えられるとそれまでですが
新規投稿以外のPOSTアクセスが無いことからすると
業者もJavascript までは見てないようです。
導入して3日経ちましたが今のところ100%排除できています。
もし投稿してきたら、こちらも URL を変えるまでです。
その間にも着々とブラックリストは更新されていきます。
- 新しい: ワンタイムチケットでスパム投稿対策
- 古い: アクセスログの(null) を含むリクエスト
コメント:7
- ゆうじ 2009-03-30 月
普通のブラウザでフォームページをリクエストすると
このページに付随するファイル(画像、StyleSheet、JavaScriptなど)も
あわせてリクエストがあるものですが
フォームを収集してるロボットはこの痕跡がまったくありません。
JavaScriptを収集してないのでJavaScriptでフォームを表示してる限りは
フォームを獲得を阻止出来てスパム投稿もありません。
インラインでJavascriptを書くと解析を楽にしてしまうので
Javascriptは別ファイルにすることがポイントです。- とおりすがり 2009-07-31 金
素晴らしい!
けど普段セキュリティ対策のためJavascriptを切って
ブラウジングしている「人間」もいることも忘れないで!- ハレルヤ 2013-10-24 木
ゆうじ様こんにちわ。早速試させて頂いたところ
導入後、3日経ちますがスパムは一通も来ておりません。
非常に助かりました。ありがとうございます。大変初歩的な質問で申し訳ないのですが、
今回はprototype.jsを使用した方法を教えて頂いたのですが
この方法は、jQueryでも効果がある方法なのでしょうか?教えていただけると幸いです。
宜しくお願い致します。- ゆうじ 2013-10-29 火
こんばんわ。嬉しいご報告ありがとうございます。
prototype.jsは、単に該当するフォームのaction属性を得るために使ってるだけなので、これをjQueryに変えてもでもOKです。ただ、ちょっと変えないとね。これでいいかな?
function validateForm()
{
// フォームの送信先を正規のURLに変えます。
$(“#postForm”).attr(“action”,”/post”);
return true;
}- ヒロユキ 2014-05-02 金
連日のスパムメールに困ってここにたどり着きました。
なんとかゆうじさんの方法を試してみたいと頑張っているのですが、
URLの受け渡しがうまくいきません。できるだけjQueryでやりたのですが、記述方法を素人でもわかるようにお願いできませんでしょうか?
ちなみに、フォームの頭部分はこうなっています。
- ヒロユキ 2014-05-02 金
すみません、なぜか途中で切れました(汗)。
form id=”mailform” method=”post” action=”mailform/send.cgi” onsubmit=”return sendmail(this);”
- ゆうじ 2014-05-04 日
ヒロユキさんこんにちは。
関数sendmail()内で return true; を返す直前に
function sendmail()
{
//
// 元の処理色々
//
$(‘#mailform’).attr(‘action’,’mailform/send.cgi’); // この行を追記
return true;
}