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