SQL隱碼攻擊是駭客對資料庫進行攻擊常用的手段之一,隨著B/S模式應用開發的發展,由於沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢程式碼,根據程式返回的結果,獲得某些他想獲取的資料,這就是所謂的SQL Injection,即SQL隱碼攻擊。
下面我們就通過實際生產中的例子來演示什麼是SQL隱碼攻擊。
當我們不注意sql攻擊的時候sql容易些成下面這樣:
public List<People> orderList (String peopleid){
String sql = " select id,name,age from people where people_id = " + peopleid;
return jdbcTemplate.query(sql,new BeanPropertyRowMapper(People.class));
}
這個時候我們將前端傳入的引數直接拼接到sql語句的後端,此時就容易出現sql注入攻擊。
越過判斷條件查詢所有資料
查詢mysql版本號(version())
查詢資料庫名(database())
查詢mysql當前使用者的所有庫
由此我們可以看出,只要使用拼接sql的方式,對方就有一百種方法來攻擊你,找到一些關鍵資料。
程式碼層防止sql注入攻擊的最佳方案就是sql預編譯
public List<People> orderList (String peopleid){
String sql = " select id,name,age from people where people_id = ?" ;
return jdbcTemplate.query(sql,new BeanPropertyRowMapper(People.class));
}
這樣穿過來的引數 4 or 1 = 1 就會被當做是一個people_id,就不會出現SQL隱碼攻擊了。