ACTION的代碼: showuser.do
String username = null;
username = request.getParameter("username");
Service service = new Service();
service.findByUsername(username);
得到參數後調用service,service層直接交給了Dao層,dao的代碼:
public Object findByUsername(String username)
{
JdbcTemplate jt=new JdbcTemplate();
String sql = "select * from Users where username=』"+username"』";
List list = jt.query(sql);
...................
}
剛才分析流程,是從正向分析的,從用戶輸入到產生漏洞,我們在防禦的時候,不妨倒過來看看,從DB層入手。JdbcTemplate調用執行SQL語句,可以有兩個類供我們選擇,一個是Statement,另一個就是預處理的Statement,兩者有著效率上和安全上的顯著差別。在效率上,只要數據庫支持預處理技術(sqlserver,mysql,oracle等都支持,只有少數access等不支持),就會在大量執行SQL語句時增加速度;在安全上,使用預處理,會把接受的參數也經過預處理,從而不會作為SQL語句的一部分執行,而是僅僅作為SQL語句中的參數部分內容被執行。一旦DB層使用了預處理,DAO層的SQL語句也會發生變化,成為這個樣子:
public Object findByUsername(String username)
{
JdbcTemplate jt=new JdbcTemplate();
String sql = "select * from Users where username=?";
List list = jt.query(sql,new Object[1]{username});
...................
}