Ruby mysql2でSQLインジェクション対策

Ruby mysql2でSQLインジェクション対策を行う方法について確認しました。

※目次をクリックすると目次の下部にコンテンツが表示されます。

セミコロンで分割して複数のSQLを実行する攻撃
下記コードを実行すると構文エラーになりました。
 
セミコロンで分割して複数のSQLを実行することは出来なくなっているようです。
 
(サンプルコード)

results = client.query("SELECT id,name FROM win1 WHERE id= 12345; SELECT id,name FROM spl_table")
results.each do |row|
  puts row
end

シングルクォートを挿入して不正に実行
1)問題のあるコード
 
○サンプルコード

id = 12345
name = "' OR 'A' = 'A"
results = client.query("SELECT id,name FROM spl_table WHERE id= '#{id}' AND name = '#{name}'")
results.each do |row|
  puts row
end

 
○結果
以下のSQLが実行され、すべてのIDの情報が取得されてしまう。
 
SELECT id,name FROM spl_table WHERE id= ‘12345’ AND name = ” OR ‘A’ = ‘A’
 
2)エスケープ処理をして対策
 
client.escape()でエスケープしてから実行
 
○サンプルコード

id = 12345
name = "' OR 'A' = 'A"
name = client.escape("' OR 'A' = 'A")
results = client.query("SELECT id,name FROM spl_table WHERE id= '#{id}' AND name = '#{name}'")
results.each do |row|
  puts row
end

 
○結果
下記のようにシングルクォートがエスケープされ、不正に情報を取得されなくなります。
‘ OR ‘A’ = ‘A
 ↓
\’ OR \’A\’ = \’A
 
●client.escape()の実行例
 
gi’t\h\\u\”b;be\0r’s
 ↓
gi\’th\\u\”b;be\0r\’s
 
・シングルクォート’はエスケープされて\’になる。
・\hは特別な意味は無いので、\が削除される。
・\\はバックスラッシュ文字を意味するのでそのまま。
・\”は二重引用符を意味するのでそのまま。
・\0はNUL文字を意味するのでそのまま。

関連記事の目次

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください