Asp.net中進行安全的 ADO.NET 編碼(一)
2024-07-10 12:56:46
供稿:網友
asp.net中進行安全的 ado.net 編碼(一)
保證應用程序的安全包括編寫安全的代碼。代碼必須只公開客戶端代碼所需要的信息和功能。與 ado.net 相關的常見攻擊是 sql insertion 攻擊,它從應用程序返回的異常中來確定私有數據庫信息。
危險性:
在 sql insertion 攻擊中,攻擊者在您的命令中插入在數據源位置執行處理的其他 sql 語句。這些命令不僅可以修改或破壞數據源位置的信息,還可以檢索您的私有信息。將命令字符串與外部輸入串聯在一起的代碼容易受到 sql insertion 攻擊。例如,以下代碼容易受到 sql insertion 攻擊。
[visual basic]
dim custid as string = getcustomerid()
dim selectstring as string = "select * from customers where customerid = " & custid
dim cmd as sqlcommand = new sqlcommand(selectstring, conn)
conn.open()
dim myreader as sqldatareader = cmd.executereader()
myreader.close()
conn.close()
攻擊者可為要查詢的 customerid 輸入一個值“1;drop table customers”。這會導致為此查詢執行以下命令。
select * from customers where customerid = 1;drop table customers
為了防止 sql insertion 攻擊,請驗證來自外部源的輸入,并傳遞列值作為參數,而不是串聯這些值來創建 sql 語句。
解決方法一:
使用正則表達式
可以使用正則表達式驗證輸入與特定的格式是否匹配。.net framework 提供了 regex 對象,以根據正則表達式來驗證值。例如,以下代碼用于確保值為 5 個字符的字母字符串。
[visual basic]
public static function validate(instring as string) as boolean
dim r as regex = new regex("^[a-za-z0-9]{5}$")
return r.ismatch(instring)
end function
解決方法二:
使用參數
參數提供了一種有效的方法來組織隨 sql 語句傳遞的值,以及向存儲過程傳遞的值。另外,通過確保從外部源接收的值僅作為值傳遞,而不是作為 sql 語句的一部分傳遞,可以防止參數受到 sql insertion 攻擊。因此,在數據源處不會執行插入到值中的 sql 命令。相反,所傳遞的這些值僅僅被視為參數值。以下代碼顯示了使用參數傳遞值的一個示例。
[visual basic]
dim custid as string = getcustomerid()
dim selectstring as string = "select * from customers where customerid = @customerid"
dim cmd as sqlcommand = new sqlcommand(selectstring, conn)
cmd.parameters.add("@customerid", sqldbtype.varchar, 5).value = custid
conn.open()
dim myreader as sqldatareader = cmd.executereader()
myreader.close()
conn.close()