SQLインジェクション

SQLインジェクション

概要

SQLインジェクションは、信頼できない入力をSQL文へ直接連結したときに発生します。

影響

攻撃者はデータの参照、改ざん、削除、認証回避を行う可能性があります。

対策

文字列連結ではなく、プレースホルダ、プリペアドステートメント、ORMのバインド、厳格な入力検証を使用します。

try {
    String tableName = props.getProperty("jdbc.tableName");
    String name = props.getProperty("jdbc.name");
    String query = "SELECT * FROM " + tableName + " WHERE Name =" + name;
    stmt = con.createStatement(query);
    rs = stmt.executeQuery();
   ...
} catch (SQLException sqle) { ... } finally { ... }
<select id="selectByUserId" resultType="com.devkuma.dto.User">
    SELECT user_id,
      FROM devkuma_user
     WHERE user_id = '${userId}'
</select>
String tableName = props.getProperty("jdbc.tableName");
String name = props.getProperty("jdbc.name");
String query = "SELECT * FROM " + tableName + " WHERE Name =" + name;
stmt = con.prepareStatement(query);
rs = stmt.executeQuery();
...
String tableName = props.getProperty("jdbc.tableName");
String name = props.getProperty("jdbc.name");
String query = "SELECT * FROM ? WHERE Name = ?";
stmt = con.prepareStatement(query);
stmt.setString(1, tableName); stmt.setString(2, name);
rs = stmt.executeQuery();
...