0

私はセキュリティ愛好家であり、RoR の初心者です。現在、アクティブ レコードが配置された RoR での SQL インジェクションに関して、私が出会ったこのブログがあります。

RoR アクティブ レコードの SQLi

ただし、ブログ自体は 2013 年 1 月にさかのぼります。それでも、Rails 4.2 と ActiveRecord 4.2 を使用したテスト環境で SQLi を複製しようとしました。

私は使用してみました:

User.find_by_name("kotori", :select => "id, name")

上記のブログからですが、次のエラーを受け取りました:

ArgumentError: 引数の数が間違っています (1 に対して 2)

思考プロセス: ブログはかなり古いので、テスト セットアップによると非推奨の機能である可能性があります。ブログは 1 月 13 日のものなので、ここから 2012 年 12 月のアクティブ レコード ビルドを取得しました。少なくともこのリリースでは上記のコード スニペットが確実に機能すると考えていましたが、エラーは同じでした。さらに、ここで同じドキュメントを調べてみましたが、これでも問題のコード スニペットについての洞察は得られません。

ここで何が欠けていますか?上記のブログ自体が信頼できないということですか、それとも本当にばかげているということですか :)

4

2 に答える 2

1

このオプションが最後に見られたのは Rails 2.3 で、かなり前のことだと確信してい:select => "id, name"ます。2.3 のコミュニティ サポート (およびすべてのセキュリティ修正) は約 3 年前に終了しました。これは、Rails 4.0 がリリースされたときに、参照されている記事が書かれたのとほぼ同じ時期です。

この情報は当時よく知られていただけでなく、この記事の 3 年以上前に Rails 3.0 から削除されていました。そのため、著者は記事をサポートするためにかなり古い情報を使用していました。当時まだ 2.3 を実行しているサイトがまだあったことは間違いありません (昨日のこの SO の質問を参照してください)。記事を読んで、それは本質的に事実でした。ただし、重要なポイントを作成するために急速に古くなる情報を使用しましたが、実際にはそのように識別していませんでした。

いざ現代へ。同じ目標を達成することはできますが、今では別の手段が必要です。 pluck次のように、特定の列 (例:idnameフィールドのみ) を効率的に選択できます。

User.where(name: 'kotori').pluck(:id, :name)

これにより、最適化された SQL ステートメントが生成されます。さらに、クエリ エンジンに渡される SQL スニペットがないため、SQL インジェクションの機会がありません。セキュリティはかなり長い間 Rails コミュニティの最優先事項であり、それは良いことです。

于 2016-05-06T09:29:44.080 に答える