Referer SPAM 対策を考えるついでに disp_referrer のキャッシュ方法を考えた。 tDiary ではリファラは常に最新の日付にだけ蓄積されるので、 最新日より一日以上古いリファラは決して更新されない (と思う)。 つまり update.rb が日付をまたいだ時点で 前日分のリファラを処理して結果だけ保存すれば十分なはずだ。 (ちなみに最新日だけは覚悟を決めて毎回計算する。)
で、それと微妙に関連するんだけども、 tDiary のデータベースは日単位にしたらどうなんだろう。 例えばこんな感じのディレクトリ構造にする。
200401/ 01/ property …… Visible とか Format とか data …… 日記 comment/ …… ツッコミ 01/ property data 02 : referer …… リファラ 02/ 03/ :
qmail のごとく、property をさらに細かくファイルに分けてもよい。 今の実装だと日付関係の計算をするためには一月まるごと読まないとならないけど、 ファイルが日単位になってればツリーのトラバースだけで済むのが利点だ。
……なんか実装したくなってきた (しないけど)
(18:07)
いくらなんでも重なりすぎ! (笑)
(19:27)
[ruby-list:40021] から始まる「クラス名→クラスオブジェクト」の話だけど、 ちょっと細かいことになるのでこっちに追記。
クラス名からクラスオブジェクトを得る方法として
eval(classname) classname.split(/::/).inject(Object) {|c,name| c.const_get(name) }
の二つがある。 で、このうち eval は危険だとすぐわかるのでみんな注意する。
しかし、この場合に eval が危険なのは classname をリモートからかなり自由に指定できる場合である。 classname が定数なら「eval しているから危険」とは言えない。
そしてまた、引数が自由になるのであれば、 同じ状況で const_get を使ったところで安全とは言えない。 例えば classname に任意文字列を指定できるとすると、 (任意のクラス).new (など) が呼べることになる。 すぐには具体的な例が思いつかないんだが、 DL とか Win32API とか IO あたりを new すると それなりに危ないことができそうな予感がしないでもない。
ちなみに $SAFE=1 でも Object.const_get("IO".taint) は通るので $SAFE も当てにならない (シンボルは汚染されない)。
(23:00)
(追記) やっぱり new だけですごくやばいことができる例がないとイマイチ説得力がないな。 任意のコードの eval に比べると攻撃力が違いすぎ。
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
> tDiary ではリファラは常に最新の日付にだけ蓄積される
逆かと。最新の日付に蓄積「されないように」する設定変更は可能ですが、permlink経由のリファラは常に特定の日付に記録されて、これを記録しないようにする手段はないはずです。
ちなみにその設定は設定画面の「リンク元->リンク元の記録制御」でやります。
ええ、うそっ? うわー、本当だ。恥ずい……。
え、じゃあ、昔の日記の referer も隱れて増えてるのか。
なんかすごい数になってるリファラがありそうだけど。
最高でも「みこみこ」の 1500 ちょいか。ちぇ。