Ruby mysql2でSQLインジェクション対策を行う方法について確認しました。
※目次をクリックすると目次の下部にコンテンツが表示されます。
セミコロンで分割して複数の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文字を意味するのでそのまま。