欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

防御SQL注入的方法總結(jié)

 更新時間:2015年08月10日 14:25:31   作者:digdeep  
這篇文章主要講解了防御SQL注入的方法,介紹了什么是注入,注入的原因是什么,以及如何防御,需要的朋友可以參考下

SQL 注入是一類危害極大的攻擊形式。雖然危害很大,但是防御卻遠(yuǎn)遠(yuǎn)沒有XSS那么困難。

SQL 注入可以參見:https://en.wikipedia.org/wiki/SQL_injection

SQL 注入漏洞存在的原因,就是拼接 SQL 參數(shù)。也就是將用于輸入的查詢參數(shù),直接拼接在 SQL 語句中,導(dǎo)致了SQL 注入漏洞。

1. 演示下經(jīng)典的SQL注入

我們看到:select id,no from user where id=2;

如果該語句是通過sql字符串拼接得到的,比如: String sql = "select id,no from user where id=" + id;

其中的 id 是一個用戶輸入的參數(shù),那么,如果用戶輸入的是 2, 那么上面看到查到了一條數(shù)據(jù),如果用戶輸入的是 2 or 1=1 進(jìn)行sql注入攻擊,

那么看到,上面的語句(select id,no from user where id=2 or 1=1;)將user表中的所有記錄都查出來了。

這就是典型的sql注入。

再看一列:

我們看到通過 sql 注入能夠直接將表 sqlinject 刪除掉!可見其危害!

2. sql 注入的原因

sql注入的原因,表面上說是因?yàn)?拼接字符串,構(gòu)成sql語句,沒有使用 sql語句預(yù)編譯,綁定變量。

但是更深層次的原因是,將用戶輸入的字符串,當(dāng)成了 “sql語句” 來執(zhí)行。

比如上面的 String sql = "select id,no from user where id=" + id;

我們希望用戶輸入的 id 的值,僅僅作為一個字符串字面值,傳入數(shù)據(jù)庫執(zhí)行,但是當(dāng)輸入了: 2 or 1=1 時,其中的 or 1=1 并沒有作為 where id= 的字面值,而是作為了 sql語句 來執(zhí)行的。所以其本質(zhì)是將用戶的輸入的數(shù)據(jù),作為了命令來執(zhí)行。

3. sql注入的防御

1> 基本上大家都知道 采用sql語句預(yù)編譯和綁定變量,是防御sql注入的最佳方法。但是其中的深層次原因就不見得都理解了。

 String sql = "select id, no from user where id=?";
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setInt(1, id);
    ps.executeQuery();

如上所示,就是典型的采用 sql語句預(yù)編譯和綁定變量 。為什么這樣就可以防止sql 注入呢?

其原因就是:采用了PreparedStatement,就會將sql語句:"select id, no from user where id=?" 預(yù)先編譯好,也就是SQL引擎會預(yù)先進(jìn)行語法分析,產(chǎn)生語法樹,生成執(zhí)行計劃,也就是說,后面你輸入的參數(shù),無論你輸入的是什么,都不會影響該sql語句的語法結(jié)構(gòu)了,因?yàn)檎Z法分析已經(jīng)完成了,而語法分析主要是分析sql命令,比如 select ,from ,where ,and, or ,order by 等等。所以即使你后面輸入了這些sql命令,也不會被當(dāng)成sql命令來執(zhí)行了,因?yàn)檫@些sql命令的執(zhí)行, 必須先的通過語法分析,生成執(zhí)行計劃,既然語法分析已經(jīng)完成,已經(jīng)預(yù)編譯過了,那么后面輸入的參數(shù),是絕對不可能作為sql命令來執(zhí)行的,只會被當(dāng)做字符串字面值參數(shù)。所以sql語句預(yù)編譯可以防御sql注入。

2> 但是不是所有場景都能夠采用 sql語句預(yù)編譯,有一些場景必須的采用 字符串拼接的方式,此時,我們嚴(yán)格檢查參數(shù)的數(shù)據(jù)類型,還有可以使用一些安全函數(shù),來方式sql注入。

比如 String sql = "select id,no from user where id=" + id;

在接收到用戶輸入的參數(shù)時,我們就嚴(yán)格檢查 id,只能是int型。復(fù)雜情況可以使用正則表達(dá)式來判斷。這樣也是可以防止sql注入的。

安全函數(shù)的使用,比如:  

 MySQLCodec codec = new MySQLCodec(Mode.STANDARD);
    name = ESAPI.encoder().encodeForSQL(codec, name);
    String sql = "select id,no from user where name=" + name;

ESAPI.encoder().encodeForSQL(codec, name)
該函數(shù)會將 name 中包含的一些特殊字符進(jìn)行編碼,這樣 sql 引擎就不會將name中的字符串當(dāng)成sql命令來進(jìn)行語法分析了。

注:

實(shí)際項(xiàng)目中,一般我們都是采用各種的框架,比如ibatis, hibernate,mybatis等等。他們一般也默認(rèn)就是sql預(yù)編譯的。對于ibatis/mybatis,如果使用的是 #{name}形式的,那么就是sql預(yù)編譯,使用 ${name} 就不是sql預(yù)編譯的。

以上就是SQL注入防御方法總結(jié),希望對大家之后的學(xué)習(xí)有所幫助。

相關(guān)文章

  • 判斷字段是否被更新 新舊數(shù)據(jù)寫入Audit Log表中

    判斷字段是否被更新 新舊數(shù)據(jù)寫入Audit Log表中

    客戶要求,要對一個敏感數(shù)據(jù)表進(jìn)行Audit跟蹤。如果記錄被更新時,要把舊新保存起來,是誰更改了記錄,什么時候更新的等相關(guān)信息。還有一個主要問題就是客戶不確定具體要跟蹤那個字段,希望自己決定
    2012-01-01
  • SQL查詢排名函數(shù)實(shí)例

    SQL查詢排名函數(shù)實(shí)例

    本文主要講解SQL查詢排名函數(shù)實(shí)例,比較實(shí)用,希望能給大家做一個參考。
    2016-06-06
  • sql server日志處理不當(dāng)造成的隱患詳解

    sql server日志處理不當(dāng)造成的隱患詳解

    這篇文章主要給大家介紹了關(guān)于sql server日志處理不當(dāng)造成的隱患的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用sql server具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • sql server幾種Join的區(qū)別測試方法

    sql server幾種Join的區(qū)別測試方法

    這篇文章主要來介紹下Inner Join , Full Out Join , Cross Join , Left Join , Right Join的區(qū)別,需要的朋友可以參考下
    2016-07-07
  • SQL2000中的默認(rèn)sa帳號的修改與刪除方法

    SQL2000中的默認(rèn)sa帳號的修改與刪除方法

    MSSQL默認(rèn)的sa很少有人改動,但是經(jīng)常有人用工具掃描sa賬戶,并且爆破密碼
    2013-02-02
  • 數(shù)據(jù)庫SQL中having和where的用法區(qū)別

    數(shù)據(jù)庫SQL中having和where的用法區(qū)別

    這篇文章主要介紹了數(shù)據(jù)庫SQL中having和where的用法區(qū)別的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-11-11
  • SQL Server存儲過程中使用表值作為輸入?yún)?shù)示例

    SQL Server存儲過程中使用表值作為輸入?yún)?shù)示例

    這篇文章主要介紹了SQL Server存儲過程中使用表值作為輸入?yún)?shù)示例,使用表值參數(shù),可以不必創(chuàng)建臨時表或許多參數(shù),即可向 Transact-SQL 語句或例程(如存儲過程或函數(shù))發(fā)送多行數(shù)據(jù),這樣可以省去很多自定義的代碼,需要的朋友可以參考下
    2015-07-07
  • SQL?Server基礎(chǔ)教程之游標(biāo)(Cursor)

    SQL?Server基礎(chǔ)教程之游標(biāo)(Cursor)

    這篇文章主要給大家介紹了關(guān)于SQL?Server基礎(chǔ)教程之游標(biāo)(Cursor)的相關(guān)資料,游標(biāo)是SQL Server的一種數(shù)據(jù)訪問機(jī)制,它允許用戶訪問單獨(dú)的數(shù)據(jù)行,需要的朋友可以參考下
    2023-11-11
  • 輕量級數(shù)據(jù)庫SQL?Server?Express?LocalDb介紹

    輕量級數(shù)據(jù)庫SQL?Server?Express?LocalDb介紹

    這篇文章介紹了輕量級數(shù)據(jù)庫SQL?Server?Express?LocalDb,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • sql 觸發(fā)器使用例子

    sql 觸發(fā)器使用例子

    觸發(fā)器里沒有updated ,只有inserted 和deleted兩個臨時表。
    2009-07-07

最新評論