日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

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

系統(tǒng) 3022 0

SQL 注入往往是在程序員編寫包含用戶輸入的動(dòng)態(tài) 數(shù)據(jù)庫(kù) 查詢時(shí)產(chǎn)生的,但其實(shí)防范 SQL 注入的方法非常簡(jiǎn)單。程序員只要 a )不再寫動(dòng)態(tài)查詢,或 b )防止用戶輸入包含能夠破壞查詢邏輯的惡意 SQL 語(yǔ)句,就能夠防范 SQL 注入。在這篇 文章 中,我們將會(huì)說(shuō)明一些非常簡(jiǎn)單的防止 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);

}

在以上代碼中,我們可以看到并未對(duì)變量 customerName 做驗(yàn)證, customerName 的值可以直接附在 query 語(yǔ)句的后面?zhèn)魉偷綌?shù)據(jù)庫(kù)執(zhí)行,則攻擊者可以將任意的 sql 語(yǔ)句注入。

防范方法 1 :參數(shù)化查詢

參數(shù)化查詢是所有開(kāi)發(fā)人員在做數(shù)據(jù)庫(kù)查詢時(shí)首先需要 學(xué)習(xí) 的,參數(shù)化查詢迫使所有開(kāi)發(fā)者首先要定義好所有的 SQL 代碼,然后再將每個(gè)參數(shù)逐個(gè)傳入,這種編碼風(fēng)格就能夠讓數(shù)據(jù)庫(kù)辨明代碼和數(shù)據(jù)。

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

對(duì)于不同編程語(yǔ)言,有一些不同的建議:

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

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

PHP ——使用帶強(qiáng)類型的參數(shù)化查詢 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

}

?

防范方法二:存儲(chǔ)過(guò)程

存儲(chǔ)過(guò)程和參數(shù)化查詢的作用是一樣的,唯一的不同在于存儲(chǔ)過(guò)程是預(yù)先定義并存放在數(shù)據(jù)庫(kù)中,從而被應(yīng)用程序調(diào)用的。

Java 存儲(chǔ)過(guò)程示例:

??????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 存儲(chǔ)過(guò)程示例:

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

?

防范方法三:對(duì)所有用戶輸入進(jìn)行轉(zhuǎn)義

我們知道每個(gè) DBMS 都有一個(gè)字符轉(zhuǎn)義機(jī)制來(lái)告知 DBMS 輸入的是數(shù)據(jù)而不是代碼,如果我們將所有用戶的輸入都進(jìn)行轉(zhuǎn)義,那么 DBMS 就不會(huì)混淆數(shù)據(jù)和代碼,也就不會(huì)出現(xiàn) SQL 注入了。

當(dāng)然,如果要采用這種方法,那么你就需要對(duì)所使用的數(shù)據(jù)庫(kù)轉(zhuǎn)義機(jī)制,也可以使用現(xiàn)存的諸如 OWASP ESAPI escaping routines ESAPI 目前是基于 MySQL Oracle 的轉(zhuǎn)義機(jī)制的,使用起來(lái)也很方便。一個(gè) Oracle ESAPI 的使用示例如下:

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

那么,假設(shè)你有一個(gè)要訪問(wèn) Oracle 數(shù)據(jù)庫(kù)的動(dòng)態(tài)查詢代碼如下:

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) ;

}

那么,你就必須重寫你的動(dòng)態(tài)查詢的第一行如下:

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 ))+ ;

?

當(dāng)然,為了保證自己代碼的可讀性,我們也可以構(gòu)建自己的 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 ))+ ;

?

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

最小權(quán)限法:

為了避免注入攻擊對(duì)數(shù)據(jù)庫(kù)造成的損害,我們可以把每個(gè)數(shù)據(jù)庫(kù)用戶的權(quán)限盡可能縮小,不要把 DBA 或管理員的權(quán)限賦予你應(yīng)用程序賬戶,在給用戶權(quán)限時(shí)是基于用戶需要什么樣的權(quán)限,而不是用戶不需要什么樣的權(quán)限。當(dāng)一個(gè)用戶只需要讀的權(quán)限時(shí),我們就只給他讀的權(quán)限,當(dāng)用戶只需要一張表的部分?jǐn)?shù)據(jù)時(shí),我們寧愿另建一個(gè)視圖讓他訪問(wèn)。

如果你的策略是都是用存儲(chǔ)過(guò)程的話,那么僅允許應(yīng)用程序的賬戶執(zhí)行這些查詢,而不給他們直接訪問(wèn)數(shù)據(jù)庫(kù)表的權(quán)限。諸如此類的最小權(quán)限法能夠在很大程度上保證我們數(shù)據(jù)庫(kù)的安全。

輸入驗(yàn)證白名單法:

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

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 富源县| 吉木乃县| 剑河县| 陇南市| 溆浦县| 拜城县| 进贤县| 石门县| 乡宁县| 双鸭山市| 都江堰市| 阳江市| 常山县| 平湖市| 乌鲁木齐县| 隆安县| 瑞金市| 高平市| 武威市| 无棣县| 肇东市| 内江市| 凌源市| 澄迈县| 瓦房店市| 潜江市| 武山县| 建宁县| 郁南县| 茌平县| 蓬莱市| 含山县| 德阳市| 三亚市| 远安县| 华蓥市| 天峨县| 洛隆县| 唐河县| 威海市| 嵊泗县|