例えば以下のようなメソッドで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には感謝ですが、こっちの方がかなり使いやすいです。
皆さんも是非。