環境
- Rails 5
やりたいこと
RailsでActiveRecordの生成するSQLではなく、生SQL実行したいときは以下のようにしてできる。
ActiveRecord::Base.connection.execute("select count(1) from users where date = '2018-10-20'")
が、プレースホルダー機能を使おうとするとエラーになる。
# not work ActiveRecord::Base.connection.execute("select count(1) from users where date = ?", "2018-10-20")
実はActiveRecord::Base.connection.execute
ではプレースホルダーによるエスケープは使えない。残念。。。
なんとかしてエスケープする
ActiveRecordのsanitize_sql_array
を使う 例えば以下のような感じ
sql = ["select count(1) from users where date = ?", "2018-10-20"] sanitized_sql = ActiveRecord::Base.send(:sanitize_sql_array, sql) ActiveRecord::Base.connection.execute(sanitized_sql)
これでめでたくSQLインジェクション対策ができる やったね