例えば以下のようなメソッドでRailsのroutingを使ったURLを出力する場合を考えます。
以下のようなクラスを想定
class Post < ActiveRecord::Base
end
$ post_path(@post)
http://127.0.0.1/post/1
これだとPostが連番なことがバレて攻撃をされやすいです。
そこで、ID難読化のgemがobfuscate_idがあります。
これを使うと、
class Post < ActiveRecord::Base
obfuscate_id
end
のように宣言したクラスでURLを生成。
$ post_path(@post)
http://127.0.0.1/post/428374365
このように難読化されるので連番の攻撃などはできなくなります。
仕組み的にはidはそのままでto_paramに難読化後の値が出ます。
でも、このgemは困ったことに既存のfindメソッドを上書きするため、posts.foo_ids=のようなAssociation用のidのfindにも適用され、formからのデータ更新でto_paramではなくidを使っていた場合(ほとんどがそうだと思いますが。。。)エラーになってしまいます。
また、Associationに対するoffer.posts.findの時は難読化のidは使えないなど挙動が一定でないです。
なので、forkして新しくobfuscatableという難読化がoptionalなgemを作りました。
これを使う場合は
class Post < ActiveRecord::Base
obfuscatable
end
のように宣言し、
今までfindで難読化されたidを受けていたところをfind_obfuscatedにします。
Associationに対するfindもfind_obfuscatedのように一貫した使い方ができます。
元ネタのgemには感謝ですが、こっちの方がかなり使いやすいです。
皆さんも是非。