亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

防sql注入 盲注等措施 ESAPI的使用

系統 2609 0

SQL 注入往往是在程序員編寫包含用戶輸入的動態 數據庫 查詢時產生的,但其實防范 SQL 注入的方法非常簡單。程序員只要 a )不再寫動態查詢,或 b )防止用戶輸入包含能夠破壞查詢邏輯的惡意 SQL 語句,就能夠防范 SQL 注入。在這篇 文章 中,我們將會說明一些非常簡單的防止 SQL 注入的方法。

我們用以下 Java 代碼作為示例,

String query = SELECT account_balance FROM user_data WHERE user_name =

+ request.getParameter( customerName );

?

try {

Statement statement? = ? connection.createStatement( …);

ResultSet results = ? Statement.executeQuery(query);

}

在以上代碼中,我們可以看到并未對變量 customerName 做驗證, customerName 的值可以直接附在 query 語句的后面傳送到數據庫執行,則攻擊者可以將任意的 sql 語句注入。

防范方法 1 :參數化查詢

參數化查詢是所有開發人員在做數據庫查詢時首先需要 學習 的,參數化查詢迫使所有開發者首先要定義好所有的 SQL 代碼,然后再將每個參數逐個傳入,這種編碼風格就能夠讓數據庫辨明代碼和數據。

參數化查詢能夠確保攻擊者無法改變查詢的內容,在下面修正過的例子中,如果攻擊者輸入了 UsrID 是“ ’or ‘1 ‘=’1 ”,參數化查詢會去查找一個完全滿足名字為‘ or ‘1 ‘=’ 1 的用戶。

對于不同編程語言,有一些不同的建議:

Java EE ——使用帶綁定變量的 PreparedStatement() ;

.Net ——使用帶綁定變量的諸如 SqlCommand() OleDbCommand() 的參數化查詢;

PHP ——使用帶強類型的參數化查詢 PDO (使用 bindParam() );

Hibernate ——使用帶綁定變量的 createQuery()

Java 示例:

String custname = request.getParameter( customerName );

String query = SELECT account_balance FROM user_data WHERE user_name= ? ;

?

PreparedStatement pstmt = connection.prepareStatement(query);

Pstmt.setString(1,custname);

ResultSet results = pstmt.executeQuery();

??????

C# .Net 示例:

String query = SELECT account_balance FROM user_data WHERE user_name = ? ;

Try {?????

OleDbCommand command = new OleDbCommand(query,connection);

command.Parameters.Add(new ?OleDbParameter( customerName ,CustomerName.Text));

OleDbDataReader reader = command.ExecuteReader();

}catch (OleDbException se){

//error handling

}

?

防范方法二:存儲過程

存儲過程和參數化查詢的作用是一樣的,唯一的不同在于存儲過程是預先定義并存放在數據庫中,從而被應用程序調用的。

Java 存儲過程示例:

??????String custname = request.getParameter( customerName );

??????try {

CallableStatement cs = connection.prepareCall( call sp_getAccountBalance(?)} );

cs.setString(1,custname);

Result results = cs.executeQuery();

??????}catch(SQLException se){

?????????????//error handling

??????}

?

VB .Net 存儲過程示例:

Try

Dim command As SqlCommand = new SqlCommand( sp_getAccountBalance ,connection)

?command.CommandType = CommandType.StoredProcedure

?command.Parameters.Add(new SqlParameter( @CustomerName ,CustomerName.Text))

?Dim reader As SqlDataReader = command.ExecuteReader()

?‘…

Catch se As SqlException

?‘error handling

End Try

?

防范方法三:對所有用戶輸入進行轉義

我們知道每個 DBMS 都有一個字符轉義機制來告知 DBMS 輸入的是數據而不是代碼,如果我們將所有用戶的輸入都進行轉義,那么 DBMS 就不會混淆數據和代碼,也就不會出現 SQL 注入了。

當然,如果要采用這種方法,那么你就需要對所使用的數據庫轉義機制,也可以使用現存的諸如 OWASP ESAPI escaping routines 。 ESAPI 目前是基于 MySQL Oracle 的轉義機制的,使用起來也很方便。一個 Oracle ESAPI 的使用示例如下:

ESAPI.encoder().encodeForSQL(new OracleCodec(),queryparam);

那么,假設你有一個要訪問 Oracle 數據庫的動態查詢代碼如下:

String query = SELECT user_id FROM user_data WHERE user_name = ‘ +req.getParameter( userID )+ ’ and user_password = ‘ +req.getParameter( pwd )+ ;

try {

??????Statement statement = connection.createStatement(…);

??????ResultSet results = statement.executeQuery(query) ;

}

那么,你就必須重寫你的動態查詢的第一行如下:

Codec ORACLE_CODEC = new OracleCodec();

String query = SELECT user_id FROM user_data WHERE user_name = ‘ +

ESAPI.encoder().encodeForSQL(ORACLE_CODEC,req.getParameter( userID ))+ ’ and user_password = ‘ +

ESAPI.encoder().encodeForSQL(ORACLE_CODEC,req.getParameter( pwd ))+ ;

?

當然,為了保證自己代碼的可讀性,我們也可以構建自己的 OracleEncoder

Encoder e = new OracleEncoder();

String query = SELECT user_id FROM user_data WHERE user_name = ‘

??????+ oe.encode(req.getParameter( userID )) + ’ and user_password = ‘

??????+ oe.encode(req.getParameter( pwd ))+ ;

?

除了上面所說的三種防范方法以外,我們還建議可以用以下兩種附加的方法來防范 SQL 注入:最小權限法、輸入驗證白名單法。

最小權限法:

為了避免注入攻擊對數據庫造成的損害,我們可以把每個數據庫用戶的權限盡可能縮小,不要把 DBA 或管理員的權限賦予你應用程序賬戶,在給用戶權限時是基于用戶需要什么樣的權限,而不是用戶不需要什么樣的權限。當一個用戶只需要讀的權限時,我們就只給他讀的權限,當用戶只需要一張表的部分數據時,我們寧愿另建一個視圖讓他訪問。

如果你的策略是都是用存儲過程的話,那么僅允許應用程序的賬戶執行這些查詢,而不給他們直接訪問數據庫表的權限。諸如此類的最小權限法能夠在很大程度上保證我們數據庫的安全。

輸入驗證白名單法:

輸入驗證能夠在數據傳遞到 SQL 查詢前就察覺到輸入是否正確合法,采用白名單而不是黑名單則能在更大程度上保證數據的合法性。

防sql注入 盲注等措施 ESAPI的使用


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美jizzhd欧美巨大 | 亚洲一区国产 | 欧美日韩一区二区三 | 亚洲欧洲精品视频 | 久青草国产手机在线观 | 久久精品视频热 | 欧美日韩不卡在线 | 国产在线视频色综合 | 国产在线观看一区精品 | 激情影院在线观看 | 亚洲精品国产一区二区图片欧美 | 欧美人牲囗毛片 | 日本免费人做人一区在线观看 | 亚洲免费视频网 | 国产亚洲日本人在线观看 | 亚洲国产99在线精品一区二区 | 青草操| 一区二区在线 | 大色香蕉色视频大全 | 亚洲日韩在线视频 | 韩国高清不卡一区二区 | 亚洲精品久久久久综合网 | 日韩国产欧美一区二区三区在线 | 免费一级毛片在线播放欧美 | 免费观看a毛片一区二区不卡 | 欧美性xxxxxx爱| 亚洲综合第一欧美日韩中文 | 国产一极毛片 | 护士一级毛片 | 美女被羞羞视频网站在线 | 四虎影视免费永久在线观看黄 | 欧美猛操| 亚洲视频免费在线看 | 国产福利精品在线观看 | 不卡无毒免费毛片视频观看 | 热伊人99re久久精品最新地 | 国产成人91一区二区三区 | 奇米在线免费视频 | 四虎免费网址 | 亚洲黄色激情视频 | 久久99国产综合精品 |