fc2ブログ

正規表現でスパムコメント撃退

ここ最近、ホームページのお問い合わせにコメントスパムが入り込み、あらよという間に世界各地から1日何百件となってしまいました。入ってくる内容はこんなのです。
comment2, <a href="http://atyrausuarnasy.cn/2008-06/2007-dodge-truck-review">2007 dodge truck review</a>, [url="http://atyrausuarnasy.cn/2008-06/2007-dodge-truck-review"]2007 dodge truck review[/url], http://atyrausuarnasy.cn/2008-06/2007-dodge-truck-review 2007 dodge truck review, 37878,

入力チェックで引っ掛けるしかないのですが、入力内容の全角(日本語)有無は海外にも拠点があるため不可。そこで QuerySaveエージェントでお問い合わせ内容欄にURL(http://またはhttps://)が2個以上あれば入力エラーページに飛ばすことにしました。

お問い合わせ用DB名は"contact.nsf"。このDB内に下記を実施しました。

(1) ホームページお問い合わせ用の"contact"フォームのWebQuerySaveイベントに下記を記述する。
@Command([ToolsRunMacro]; "contact")

(2) http://またはhttps://が2個以上あったときに表示する"err"ページを用意する。このページにどのようなメッセージにすればよいのか悩んだ挙句、書いた内容はこんなのにしました。
スパム対策のため、URL(http://~)の複数書き込みはできません。
お手数ですが、戻るボタンより入力フォームにお戻りください。
You cannot input plural URL.
Please go back to the previous page by pressing the back button.

(3) "contact"エージェントに下記のスクリプトを記述。
Sub Initialize
  Dim Session As New NotesSession
  Dim Document As NotesDocument
  Dim EMail As NotesDocument
  Dim Body As NotesRichTextItem
  Dim Regex As Variant
  Dim Matches As Variant
  
  Set Document = Session.DocumentContext
  Set Regex = CreateObject("VBScript.RegExp")
  Regex.Pattern = "http://|https://"
  Regex.Ignorecase = False
  Regex.Global = True
  Set Matches = Regex.Execute(Document.GetFirstItem("MEMO").Text)
  if Matches.Count > 1 Then
    Document.SaveOptions = 0
    Print "[/domino/contact.nsf/err?OpenPage]"
  Else
    Document.SaveOptions = 1
    Print "[/contact.nsf/contact?OpenPage]"
    Set EMail = New NotesDocument(Session.CurrentDatabase)
    Set Body = New NotesRichTextItem(EMail, "Body")
    EMail.Form = "Memo"
    EMail.SendTo = Document.EMAIL(0)
    EMail.Subject = "「お問い合わせ」受付完了のお知らせ"
    Call Body.AppendText("このたびはホームページをご利用いただきありがとうございました。")
    Call Body.AddNewLine(1)
    Call Body.AppendText("おって担当者よりご連絡させていただきます。")
    Call EMail.Send(False)
  End If
End Sub

これで大半は撃退できましたが、それでもURLを一つだけにして入り込んでくるものが発生。数少ないので Document.REMOTE_ADDR(0) = "xxx.xxx.xxx.xxx" ならば入力エラーページと直指定で死滅しました。

正規表現のプログラムですが、LotusScriptのみで行う場合は "http://"の出現数をInstrでループさせてカウントするしかありません。"http://"を探すだけなので正規表現でなくても・・・ですが、プロパティで出現数を取得できて簡単なので今回もVBScript RegExpを使ってみました。LotusScriptから他言語ですがVBScriptでは
Dim Regex As Variant
Dim Matches As Variant

Set Regex = CreateObject("VBScript.RegExp")
Regex.Pattern = "http://|https://"
Regex.Ignorecase = False
Regex.Global = True
Set Matches = Regex.Execute("スパムコメント https://xxxx http://xxx http://xxx")
Msgbox Matches.Count

JavaScriptでは
Dim ScriptControl As Variant

Set ScriptControl = CreateObject("ScriptControl")
ScriptControl.Language = "JScript"
ScriptControl.ExecuteStatement "s = 'スパムコメント https://xxxx http://xxx http://xxx'.match(/http:\/\/|https:\/\//ig); i = s == null ? 0 : s.length;"
Msgbox ScriptControl.Eval("i")

LS2J(Java)では
Dim JSession As New JAVASESSION
Dim JClass As JavaClass
Dim JPattern As JavaObject
Dim JMatcher As JavaObject
Dim i As Long

Set JClass = JSession.GetClass("java/util/regex/Pattern")
Set JPattern = JClass.compile("http:\/\/|https:\/\/")
Set JMatcher = JPattern.matcher("スパムコメント https://xxxx http://xxx http://xxx")
While JMatcher.find()
  i = i + 1
Wend
Msgbox i

LS2Jですが、私のPC Windows2000 + Notes6.5では "LS2J Error: Threw java.lang.ClassNotFoundException: java.util.regex.Pattern"とエラーになり駄目。別のPC WindowsXP + Notes8.5 では動きました。java/lang/Integer など問題なく原因わかりませんでした。

個人的にはWindows環境下もあり、正規表現ではVBScriptを採用しています。ところでDomino8.5になるとLotusScriptに正規表現は用意されている?更にはコメントスパムよりもスパムメールが頭痛の種、Domino8.5に新たな対策方法ある?
スポンサーサイト



テーマ : プログラミング
ジャンル : コンピュータ

プロフィール

ピヨパパ

Author:ピヨパパ
静岡市のエンドユーザーSE。
最近はDominoの開発ばかりでうんざり。
是非気軽にコメントして下さい。

FC2カウンター
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる