先來看看百度百科的解釋:
所謂SQL注入,就是通過把SQL指令插入到Web表單送出或輸入域名或頁面請求的查詢字元串,最終達到欺騙伺服器執行惡意的SQL指令。具體來說,它是利用現有應用程式,将(惡意)的SQL指令注入到背景資料庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的資料庫,而不是按照設計者意圖去執行SQL語句。比如先前的很多影視網站洩露VIP會員密碼大多就是通過WEB表單遞交查詢字元暴出的,這類表單特别容易受到sql注入攻擊.
1.java程式中sql注入執行個體:
以使用者登入為例,已知使用者名admin。
<a href="https://s4.51cto.com/wyfs02/M01/8E/10/wKioL1i02fLiWWhoAAAsBa6CPvM681.jpg-wh_500x0-wm_3-wmp_4-s_2674122166.jpg" target="_blank"></a>
登入時,背景執行的sql如下所示:
1
<code>select</code> <code>* </code><code>from</code> <code>sys_user </code><code>where</code> <code>userid = </code><code>''</code> <code>and</code> <code>USERPWD = </code><code>''</code>
在未知使用者密碼的前提下,若在使用者名中輸入admin' and 1=1 or 'a'='a,則實際執行的sql為如下所示:
<code>select</code> <code>* </code><code>from</code> <code>sys_user </code><code>where</code> <code>userid = </code><code>'admin'</code> <code>and</code> <code>1=1 </code><code>or</code> <code>'a'</code><code>=</code><code>'a'</code> <code>and</code> <code>USERPWD = </code><code>''</code>
背景執行結果如下所示,導緻使用者密碼洩露:
<a href="https://s4.51cto.com/wyfs02/M01/8E/12/wKiom1i029rwCecoAABCwQqa9E8693.jpg-wh_500x0-wm_3-wmp_4-s_2052046126.jpg" target="_blank"></a>
登入子產品Dao層代碼:
2
3
4
<code> </code><code>public</code> <code>List<Map<String, Object>> login(String username, String password) {</code>
<code> </code><code>String sql = </code><code>"select * from sys_user where userid = '"</code><code>+username+</code><code>"' and userpwd = '"</code><code>+password+</code><code>"'"</code><code>;</code>
<code> </code><code>return</code> <code>jdbcTemplate.queryForList(sql);</code>
<code> </code><code>}</code>
2.java程式中避免sql注入
例如上面登入子產品Dao層代碼,采用的字元串拼接方式來拼接sql語句會導緻sql會被注入,是以Dao中有關sql拼接字元串方式的sql理論上都有sql注入的風險。采用對象傳入的方式可有效避免這一問題。将上面Dao中的方法優化後,如下所示:
5
6
7
<code> </code><code>String sql = </code><code>"select * from sys_user where userid = ? and userpwd = ?"</code><code>;</code>
<code> </code><code>List<Object> obj = </code><code>new</code> <code>ArrayList<Object>();</code>
<code> </code><code>obj.add(username);</code>
<code> </code><code>obj.add(password);</code>
<code> </code><code>return</code> <code>jdbcTemplate.queryForList(sql, obj.toArray());</code>
本文轉自 ycj7126168 51CTO部落格,原文連結:http://blog.51cto.com/developerycj/1901925