2008年9月14日 星期日

防禦SQL Injection

SQL Injection一般指使用者藉由輸入的資料內嵌的SQL指令來攻擊系統。

例:一個登入系統要求使用者輸入帳號密碼

若程式碼為下:
String sql = "select * from user where username='" + username +"' and password='" + password + "'";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);


若使用者已知某帳號如admin,可輸入admin'--。或是用未知的使用者登入,可輸入'or 1=1--,密碼欄位亂填,則SQL語法將變成:

select * from user where username='admin'-- and password='xxxx'
select * from user where username=''or 1=1-- and password=' '

即可成功登入系統,--為註解。

Java程式語言可以用Prepared Statements來解決,也就是預先參數化你想要的SQL語法。

例:
String sql = "select * from user where userId = ? ";
PreparedStatement preparedStmt = con.prepareStatement(sql);
preparedStmt.setString(1, userId);
ResultSet rs = prepStmt.executeQuery();

如此便不用擔心userId變數包含SQL語法了。

0 意見: