我听说“每个人”都在使用参数化的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
发布于 2009-02-12 17:53:02
您希望使用上一个示例,因为这是唯一一个真正参数化的示例。除了安全问题(这比你想象的要普遍得多),最好让ADO.NET处理参数化,因为如果不检查每个参数的Type
,就不能确定传递的值是否需要单引号。
编辑这里是一个例子:
SqlCommand command = new SqlCommand(
"select foo from bar where baz = @baz",
yourSqlConnection
);
SqlParameter parameter = new SqlParameter();
parameter.ParameterName = "@baz";
parameter.Value = "xyz";
command.Parameters.Add(parameter);
发布于 2009-02-12 17:57:02
大多数人都会通过服务器端编程语言库来实现这一点,比如PHP的PDO或Perl DBI。
例如,在PDO中:
$dbh=pdo_connect(); //you need a connection function, returns a pdo db connection
$sql='insert into squip values(null,?,?)';
$statement=$dbh->prepare($sql);
$data=array('my user supplied data','more stuff');
$statement->execute($data);
if($statement->rowCount()==1){/*it worked*/}
这将负责为数据库插入转义您的数据。
一个优点是,您可以使用一条准备好的语句多次重复插入,从而获得速度优势。
例如,在上面的查询中,我可以准备一次语句,然后循环从一堆数据创建数据数组,并根据需要多次重复->execute。
发布于 2009-02-12 17:56:06
您的命令文本需要类似于:
cmdText = "SELECT foo FROM bar WHERE baz = ?"
cmdText = "EXEC foo_from_baz ?"
然后添加参数值。这种方式确保了值con最终只被用作一个值,而对于另一种方法,如果变量fuz被设置为
"x'; delete from foo where 'a' = 'a"
你能看到可能发生的事情吗?
https://stackoverflow.com/questions/542510
复制相似问题