首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何创建参数化SQL查询?我为什么要这么做呢?

如何创建参数化SQL查询?我为什么要这么做呢?
EN

Stack Overflow用户
提问于 2009-02-12 17:47:28
回答 4查看 94.8K关注 0票数 96

我听说“每个人”都在使用参数化的SQL查询来防止SQL注入攻击,而不必验证每个用户输入。

您如何做到这一点?在使用存储过程时,您是否会自动获取此信息?

所以我的理解是这是非参数化的:

代码语言:javascript
复制
cmdText = String.Format("SELECT foo FROM bar WHERE baz = '{0}'", fuz)

这会被参数化吗?

代码语言:javascript
复制
cmdText = String.Format("EXEC foo_from_baz '{0}'", fuz)

或者我需要做一些更广泛的事情来保护自己不受SQL注入的影响?

代码语言:javascript
复制
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

EN

回答 4

Stack Overflow用户

发布于 2009-02-12 17:53:02

您希望使用上一个示例,因为这是唯一一个真正参数化的示例。除了安全问题(这比你想象的要普遍得多),最好让ADO.NET处理参数化,因为如果不检查每个参数的Type,就不能确定传递的值是否需要单引号。

编辑这里是一个例子:

代码语言:javascript
复制
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);
票数 5
EN

Stack Overflow用户

发布于 2009-02-12 17:57:02

大多数人都会通过服务器端编程语言库来实现这一点,比如PHP的PDO或Perl DBI。

例如,在PDO中:

代码语言:javascript
复制
$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。

票数 2
EN

Stack Overflow用户

发布于 2009-02-12 17:56:06

您的命令文本需要类似于:

代码语言:javascript
复制
cmdText = "SELECT foo FROM bar WHERE baz = ?"

cmdText = "EXEC foo_from_baz ?"

然后添加参数值。这种方式确保了值con最终只被用作一个值,而对于另一种方法,如果变量fuz被设置为

代码语言:javascript
复制
"x'; delete from foo where 'a' = 'a"

你能看到可能发生的事情吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/542510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档