您的EXEC示例将不会被参数化。您需要参数化的查询(有些情况下是准备好的语句),以防止类似这样的输入引起损坏:
’; DROP TABLE栏;-
尝试将其放在您的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之外,几乎所有其他权限),并以此方式获得一些保护。