sql >> データベース >  >> RDS >> PostgreSQL

Rails5SQLインジェクション

    quoteの使用 安全です。 で回答を読みましたリンクしたページ 、そしてquoteと言っている人は誰もいません 安全ではありません。 「引用符」の使用についての質問があります。はい、文字列を引用符で囲むだけの場合、安全ではありません。例:

    q = "SELECT * FROM users where email = '#{params[:email]}'"
    

    ただし、quoteを使用する (方法)は問題ありません:

    q = "SELECT * FROM users where email = #{connection.quote(params[:email])}"
    

    コンソールで遊んで、それを壊すために最善を尽くすことができますが、私はあなたができるとは思いません:

    2.3.3 :003 > ActiveRecord::Base.connection.quote("f''oo")                                                                              
     => "'f''''oo'"
    

    あなたが成功した場合、私はRailsチームが(私的に)知りたいと確信しています!しかし、ご覧のとおり、quote メソッドは、最初と最後に引用符を付けるだけではありません。

    また、信頼できる引用を探していると言うので、ソースコード自体のコメントは、ユーザー入力の引用がこれらの関数の意図された目的であることを示唆しています。

    https:/ /github.com/rails/rails/blob/2471e6391dfe71cfbb8621bdf573729d961d3209/activerecord/lib/active_record/connection_adapters/abstract/quoting.rb#L6-L13

    # Quotes the column value to help prevent
    # {SQL injection attacks}[http://en.wikipedia.org/wiki/SQL_injection].
    def quote(value)
    

    https:/ /github.com/rails/rails/blob/0f1d0b1b5254e3678abaabbebb3362a100c10262/activerecord/lib/active_record/connection_adapters/postgresql/quoting.rb#L17-L20

    # Quotes strings for use in SQL input.
    def quote_string(s) #:nodoc:
    

    quote_stringを表示していることに注意してください コメントには、おそらくquoteを使用する必要があります 、データ型を把握して適切な処理を実行しようとします。)

    ちなみに、これはあなたと同様の質問で、2014年に私からの回答があり、いくつかの選択肢もあります:レールで動的バインディングを使用してraw更新sqlを実行する方法




    1. Oracleテーブル変更モニター

    2. ASIHTTPRequestを使用してiOSから画像をアップロードする

    3. MYSQLのクエリを使用して2文字間のテキストを削除する方法

    4. テーブルインデックスの列を選択します