ページ

2005年6月13日月曜日

トラックバックスパム

最近、トラックバックによるスパムがずいぶん来るようになりました。けど、そのほとんどは .Text が自動的にはじいてくれてます。と言うのも、.Text は相手先にちゃんと自分へのリンクがあるか確認してるからです。たとえば、こちらの記事 A に対してトラックバックが送られてきたとします。このとき .Text はトラックバック送信元 (この URL はトラックバック自身に含まれている) の記事を取得し、その記事のなかに A へのリンクがあるかを確認しています。きちんとリンクが見つかればトラックバックとして登録しますが、見つからなかった場合はエラーを返してトラックバックとして受け付けません。この場合、.Text 上はどこにも記録は残りませんから、IIS のアクセスログを見たりとかしないとそういうトラックバックが来ていたこと自体わかりません。で、最近来ているトラックバックスパムもこの仕組みのおかげではじかれてました。


んが、存在しない記事に対するトラックバックが受け付けられてました。トラックバックスパムは機械的に URL を作ってるのか存在しない記事番号に対しても送られてきたりします。この場合も上記のようなチェックはしているんですが、ちょっとしたコードの問題で受け付けられてしまいます。まぁ、受け付けられても記事自体が存在しないわけですから、Web 上のどこにも表示はされません。けど、データベースには格納されてしまいますし、管理者の Feedback ページでは表示されますからうっとおしいのは確かです。


というわけで、存在しない記事へのトラックバックをエラーとするように修正。
Dottext.Framework\Tracking\TrackBackHandler.cs の 98行目くらいに


Entry trackedEntry = Entries.GetEntry(postId,true);
if (trackedEntry == null)
{
trackbackResponse (context, 1, "EntryID is invalid or missing" ) ;
}



というように青字の部分を追加してビルドすれば OK です。

5 件のコメント:

  1. コメントの表示先を見つけられなくて、不思議に思っていたんですよね。

    早速対応したいと思います。


    ありがとうございます。

    返信削除
  2. 余計なお世話であることは重々承知しておりますが、上記ですと、スパム以外もはじかれちゃうことがあるようです。

     当記事を拝見してから、自Blog(WordPress0.72, PHP)でも、trackback送信元を取得するように変更したのですが、例えば、gooブログからtrackbackされた場合などは、trackbackを受け取ったタイミングではまだ記事ページの生成が完了しておらず、自サイトへのリンクがないことになってしまいました。

    # どっちがわるいかっちゅうと、gooブログの実装なんでしょうけど…(^^;;

    一応、ご報告まで。

    返信削除
  3. > trackbackを受け取ったタイミングではまだ記事ページの生成が完了しておらず


    情報ありがとうございます。

    うーん、やっぱりそういうことがありましたか。。。困ったなぁ。

    でも、「リンク元を確認する」 というのは、 .Text のもともとの仕様なので、.Text を

    使っているサイトはみんな Goo からのトラックバックは受けられないということですね(^^;

    あと、ソースを見る限り Community Server 1.0 もほとんど同じ実装のようです

    ので CS でも Goo からのトラックバックは受けられないような気がします。


    けど、(リンク元を確認しないようにするという以外に) いい対処法を思いつかないなぁ。

    返信削除
  4. 青柳さま、こんにちは。先日はAuto-Discoveryの件、お世話になりました。

    結局私もソースを入手して、.Textをちょこちょこといじってビルドして動かしています。


    実は、私も該当の箇所に手を加えていました。

    でも、このようにしてました...。


    Entry trackedEntry = Entries.GetEntry(postId,true);


    //if (trackedEntry != null &&

    //    ! Verifier.SourceContainsTarget(url, trackedEntry.Link, out pageTitle))

    //{

    //    trackbackResponse (

    //         context, 2, "Sorry couldn't find a relevant link in " + url ) ;

    //}


    つまり、トラックバック元のURLの存在をチェックすることと、トラックバック元にこちらのURLがちゃんと入っているかどうか、です。

    .Textのつくりだと、TB元に自分の記事が入ってないと受け付けませんよね?

    それでは、厳しいかと思ったので...。

    ですが、TBスパムだけまずは防ぐなら、上記の青柳さまのような修正でOKなのかな、と思いました。

    またまた参考にさせていただきました。

    返信削除
  5. 書き込んでしまってから気がつきました。

    つまり、トラックバック元のURLの存在をチェックすることと、トラックバック元にこちらのURLがちゃんと入っているかどうか、というところを「コメントアウトした」ですね。

    恐れ入ります。。。



    返信削除