天天看點

java程式中sql注入分析及優化方案

先來看看百度百科的解釋:

    所謂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&lt;Map&lt;String, Object&gt;&gt; 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&lt;Object&gt; obj = </code><code>new</code> <code>ArrayList&lt;Object&gt;();</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