0

RoRに対するセキュリティの愛好家とトータルのノブです。今、ActiveRecordを使ってRoRでSQLインジェクションを実行していたこのブログがあります。ブログ自体が戻って月2013年にまでさかのぼりしかしアクティブなレコードの動的属性ベースのファインダー3.2.10

SQLi in RoR Active Records

はそれにもかかわらず、私はRailsの4.2とActiveRecordの4.2とテスト環境でSQLIを複製しようとしました。

私が使用してみました:上記のブログから

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

が、私は次のエラー受信:

ArgumentError: wrong number of arguments (2 for 1)

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

ここで私は何が欠けていますか?上記のブログ自体が信頼できないか、それとも本当にダムですか?

答えて

1

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

この情報は、当時非常によく知られていただけでなく、記事の3年以上前に既にRails 3.0から削除されていました。だから、作者はかなり古い情報を使って記事をサポートしていました。まだそこにあるのは間違いないです(このSO question from yesterdayを参照)。記事を読む際には、本質的に事実でした。しかし、それはキーポイントを作るために早く老化していた情報を使用しましたが、それを実際にそれを識別するものではありませんでした。

現代に。あなたは同じ目的を達成することができますが、今は別の手段が必要です。クエリに渡された何のSQLスニペットがないため

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

これは、さらに最適化されたSQL文を生成し、かつますので、同じようpluckは、あなたが効率的に特定の列(例えばのみidnameフィールド)を選択できるようになりますエンジン、SQLインジェクションの機会はありません。セキュリティはかなり長い間、Railsコミュニティの最優先事項でした。それは良いことです。

1

find_by_nameは、1つの引数しか期待していません。見つかるオブジェクトのnameです。そして、他のメソッドを呼び出すことができるActiveRecordオブジェクトを返します。

他の事:あなたが行うことができますのでfind_by_nameは、単一のレコードを返します。

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

注:find_by_name戻って1つのインスタンスので、あなたはその上pluckを呼び出すことはできません。

+0

User.find_by_name( "kotori"、:select => "id、name") 私はそれを間違って解釈していますか? – qre0ct