adiaryのセキュリティ対策

adiaryでは adiary.conf.cgi 内で設定されているセキュリティフレーズによる、各種SPAM対策、CSRF対策を行っています。ここではその対策の仕組みについて紹介します。安全なサイト運用のためにセキュリティフレーズは必ず書き換えてください

# ●以下の「秘密の言葉」を必ず書き換えてください。
<$Secret_phrase = 'すきな文字列をここに書く'>

SPAM対策

例えば、adiaryのトラックバックURLは次のようになっています。

http://adiary.org/man/09/tb/7Tv

手前から「09」は記事番号、「tb」はトラックバックを識別するための記号、「7Tv」がセキュリティーコードです

adiaryの記事番号は通し番号ですから総当たりなどの方法で適当な記事にトラックバックSPAMを送れてしまいそうです。では実際、この数字を書き換えてトラックバックを送信するとどうなるでしょうか。エラーになってしまいます。セキュリティーコードは上で設定したセキュリティーフレーズと記事番号から一定の法則で計算され、このコードが一致しないとトラックバックが送信できないようになっています。ここで大切なのことはセキュリティーフレーズが分からなければ、セキュリティーコードを計算できないということです。

では1度記事を手で確認してトラックバックURLを収集、収集したURLに自動的にトラックバックを送ろうとしたらどうなるでしょうか? 最初のうちは成功してしまいますが、1日も経てば失敗します。このセキュリティーコードは(デフォルトでは)8時間ごとに変更され、最大16時間経つと使用出来なくなります。

とすれば、SPAMロボットがトラックバックURLを認識して、即時に送信するタイプだったらどうなるでしょうか? 実はこれも難しいように作れています。試しに(ログオフした状態で)JavaScriptをオフにして記事を表示してみてください。表示が次のように切り替わるはずです。

TB-URL http://adiary.org/man/09/tb/

※お手数ですが、SPAM防止のためURLの後ろに「7Tv」を追加してください。

つまりJavaScriptを解釈できないロボットはこのメッセージを認識してトラックバックURLを構築する必要があります。よってSPAMロボットが相当賢く作ってないとトラックバックURLを知ることができません。

もちろんadiary専用のトラックバックURL解読エンジンを作られれば負けてしまいますが、それをするメリットがあるとは到底思えませんし、その手のものが登場した瞬間に対策方式を変更するのでロボット側はかなり無力です。

コメントのSPAM対策

JavaScriptオフで記事を表示させた人は気づいたと思いますが、コメント欄にも同様のSPAM対策が施されています。公式 http://blog.abk.nu に幾度となくSPAMロボットがやってきていますが、(対策以後)ロボットが書き込みに成功した例はありません。

CSRF対策

いわゆるCSRF攻撃対策のためにも、セキュリティフレーズが使われています。ログイン時に発行されるランダムな文字列である session_id とセキュリティーフレーズを使ってセキュリティーコードを生成しています。このセキュリティーコードはフォームを送信する際に必ず埋め込まれ、この値が一致しない限りフォームを受け付けない仕組みになっています。

ただし弊害として、日記を書いている最中にログアウトしてログインし直すと、日記を投稿するのにリロードが必要になります。

タグ、JavaScript対策

フォームを処理する時点で、タグの除去には細心の注意を払っています。いかなる場面でも利用出来るタグは制限されていますし、コメント欄ではタグなどは一切書けません。

JavaScriptが一切記述出来ず、個人で利用するにはやや制限がキツいこともありますので、その場合はタグの利用制限を外す方法をお試しください。