42
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RailsでIDをURLに露出させないようにする

Last updated at Posted at 2014-11-05

例えば以下のようなメソッドで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に対するfindfind_obfuscatedのように一貫した使い方ができます。

元ネタのgemには感謝ですが、こっちの方がかなり使いやすいです。
皆さんも是非。

42
38
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
38

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?