我听说“每个人”都在使用参数化 SQL 查询来防止 SQL 注入攻击,而不必验证每一条用户输入。
你怎么做到这一点?使用存储过程时会自动获取此信息吗?
所以我的理解这是非参数化的:
cmdText = String.Format("SELECT foo FROM bar WHERE baz = '{0}'", fuz)
这个可以参数化吗?
cmdText = String.Format("EXEC foo_from_baz '{0}'", fuz)
或者我是否需要做一些更广泛的事情来保护自己免受 SQL 注入?
With command
.Parameters.Count = 1
.Parameters.Item(0).ParameterName = "@baz"
.Parameters.Item(0).Value = fuz
End With
除了安全考虑之外,使用参数化查询还有其他优点吗?
更新:这篇很棒的文章链接在 Grotok 的一个问题参考文献中。http://www.sommarskog.se/dynamic_sql.html http://www.sommarskog.se/dynamic_sql.html
The EXEC
问题中的例子NOT被参数化。您需要参数化查询(在某些圈子中是准备好的语句)来防止这样的输入造成损坏:
';删除表栏;--
尝试将其放入您的fuz
变量(或者不,如果你重视bar
桌子)。更微妙和更具破坏性的查询也是可能的。
以下是如何使用 Sql Server 执行参数的示例:
Public Function GetBarFooByBaz(ByVal Baz As String) As String
Dim sql As String = "SELECT foo FROM bar WHERE baz= @Baz"
Using cn As New SqlConnection("Your connection string here"), _
cmd As New SqlCommand(sql, cn)
cmd.Parameters.Add("@Baz", SqlDbType.VarChar, 50).Value = Baz
Return cmd.ExecuteScalar().ToString()
End Using
End Function
存储过程有时被认为可以防止 SQL 注入。但是,大多数时候您仍然必须使用查询参数来调用它们,否则它们没有帮助。如果您使用存储过程只,然后您可以关闭应用程序用户帐户的 SELECT、UPDATE、ALTER、CREATE、DELETE 等权限(几乎是除 EXEC 之外的所有权限),并通过这种方式获得一些保护。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)