如何保证SQL Server免遭SQL注入攻击?
2008-09-02 09:59:24 来源:WEB开发网应用程序与数据库最简单配合使用的方法就是在应用程序内动态生成SQL命令。下面的示例中,.NET代码从前台应用程序中调用(populate)v_Input变量:
…
Dim v_Conn As New SqlConnection(p_Connectionstring)
v_Conn.Open()
Dim v_cmd As New SqlCommand
v_cmd.Connection = v_Conn
v_cmd.CommandType = CommandType.Text
v_cmd.CommandText = "exec sel_CustomerData @CustomerName=’" & v_Input & "’"
Dim v_DR As SqlDataReader
v_DR = v_cmd.executeReader
v_DR.Close()
v_DR = Nothing
v_cmd.Dispose()
v_cmd = Nothing
v_Conn.Close()
v_Conn = Nothing
v_DR.Close()
如果你不在v_Input变量中对数据进行验证,就相当于为SQL注入攻击敞开大门。如果你对输入不进行验证,就会允许攻击者传入一个单引号和一个分号,这样,将告诉SQL Server结束当前的语句,转而执行另一段sql语句pass in a single quote, and a semicolon, which tells the SQL Server to end the value and the statement moving on to the next statement in the batch。例如像这样的值“Smith ’; truncate table Customer; declare @myV =”。通过SQL Server执行的SQL语句会变成:The resulting SQL statement executed against the SQL Server
exec sel_CustomerData @CustomerName=’Smith’; truncate table Customer; declare @myV = ’’
当应用程序(calling application runs the code)运行这段代码的时候,将运行存储过程,然后表被清空。你需要进行一些基本的验证,将变量中的任何单引号替换为两个单引号。这样,就可以中止SQL Server运行删除语句truncated statement,因为现在它是值的一部分。通过这样的简单变化,我们的数据库调用现在就会像这样:
更多精彩
赞助商链接