というわけで [2007-
今回のケースに置き換えると,サーバは計算問題を生成して (これがトークン)
ということでそれを実装すればよいのだけど,どうもぐっと来ない.なぜぐっと来ないのか考えた結果,思い当たったのは以下の 2 点:
ぐっと来ないものを作ってもろくなことにならないのでとっとと却下する.
というわけで考え方を変えてみる.要は,投稿のリクエストに関して,
という条件を満たせばよいのかな.これでどうだろう.
実装はとりあえず以下のような感じ.$
<div class=" arith" > <br> コメントスパム回避のため,以下の足し算の答えを半角でご記入下さい: <br> $ arith_ x + $ arith_ y = <input class= " field" name= " arith" value= " " > <input type= " hidden" name= " arith_ token" value= " $ arith_ token" > <input type= " hidden" name= " arith_ hash" value= " $ arith_ hash" > </ div>
を仕込み,これを表示する直前に
my $arith_ x = int(rand(9) ) + 1; my $ arith_ y = int(rand(9) ) + 1; my $ accepted_ tokens = {} ; if (- e $ arith_ token_ file) { $ accepted_ tokens = Storable: : lock_ retrieve($ arith_ token_ file) ; } my $ arith_ token; do { $ arith_ token = Digest: : MD5: : md5_ hex($ logid . $ q- >remote_ host() . int(rand(2 * * 32) ) ) ; } while (defined($ accepted_ tokens- >{$ arith_ token} ) ) ; my $ arith_ hash = Digest: : MD5: : md5_ hex($ arith_ token . $ arith_ passph . ($ arith_ x + $ arith_ y) ) ;
とする.ここでは token ファイルは読み込んでいるだけなのに注意.
if ($
my $arith = $ q- >param(' arith' ) + 0; my $ arith_ token = $ q- >param(' arith_ token' ) ; my $ arith_ hash = $ q- >param(' arith_ hash' ) ; my $ accepted_ tokens = {} ; if (- e $ arith_ token_ file) { $ accepted_ tokens = Storable: : lock_ retrieve($ arith_ token_ file) ; } if (defined($ accepted_ tokens- >{$ arith_ token} ) ) { exit; } elsif ($ arith_ hash ne Digest: : MD5: : md5_ hex($ arith_ token . $ arith_ passph . $ arith) ) { exit; } else { $ accepted_ tokens- >{$ arith_ token} = 1; Storable: : lock_ store($ accepted_ tokens, $ arith_ token_ file) ; }
とした.
トークンの生成は適当で構わないのだけど,発行済みのトークンで過去に受理されたもの,および受理される可能性のあるものと重複しないようにだけは気をつける必要があるので,何かむにゃむにゃな処理をやっている.
うーむ,ちっともお手軽じゃなくなってきた.いろいろ工夫してみたところで所詮足し算を実行されたら終わりですからね.なんかベクトルが間違っている気がしないでもない.
現状の問題点:
というか何か根本的に見過ごしていることがあるような気がしてならない….どんなもんでしょ.
(追記)
2007年05月06日 kazuhooku しょうもないつっこみしてすみません。よっぱらいつつの感想:
syncookies のようなゼロ記憶だと難しいのかな。 http:
/ / b. hatena. ne. jp/ entry/ http: / / www. kagami. org/ diary/ 2007- 05- 05- 1. html
恥ずかしながら syncookies って初耳だったのでちょっと勉強.
なるほど.トークンを乱数を使って作る代わりに時刻を使うことにして,一定時間経過してたら reject するってことになりますかね.ハッシュ値の計算に時刻をつっこんでおくことで,サーバ側の保存無しで expire をチェックできるところがミソだと理解しました.
「一定時間」をうまく設定してあげる必要があるかも.短いとコメントを書いているうちに expire しちゃうし,長いとその間は固定パラメータ攻撃されちゃいますよね.まあ 1 時間くらいにしておけば実用上十分な気がしますが.
…というのが SYN cookies の動作を単純にマッピングした場合の話だと思いますけど,もしかするともっとうまい応用のしかたがあったり…?
最終更新時間: