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語法了。
2008年9月14日 星期日
防禦SQL Injection
訂閱:
張貼留言 (Atom)
0 意見:
張貼留言