Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parameters 为什么要使用参数?_Parameters_Ado.net - Fatal编程技术网

Parameters 为什么要使用参数?

Parameters 为什么要使用参数?,parameters,ado.net,Parameters,Ado.net,“我在ADO.net中看到了很多关于如何使用参数的内容,以及使我开始使用c语言的伟大网站,”他说 但我似乎无法找到你为什么不应该这样做的答案。毫无疑问,这是一个很好的理由,但我似乎找不到。请有人告诉我,这样我可以回答这个新来者在未来我喜欢帮助工作的家伙学习代码。对于一个学习c语言的新手来说,我想大多数人都会看到它的代码行更少,这似乎是一个胜利。这仅仅是因为将字符串添加到一起比使用参数更费力吗?仔细考虑如果有人在你的应用程序的城市文本框中输入以下内容会发生什么: ",;从客户中删除- 您最终将构造

“我在ADO.net中看到了很多关于如何使用参数的内容,以及使我开始使用c语言的伟大网站,”他说


但我似乎无法找到你为什么不应该这样做的答案。毫无疑问,这是一个很好的理由,但我似乎找不到。请有人告诉我,这样我可以回答这个新来者在未来我喜欢帮助工作的家伙学习代码。对于一个学习c语言的新手来说,我想大多数人都会看到它的代码行更少,这似乎是一个胜利。这仅仅是因为将字符串添加到一起比使用参数更费力吗?

仔细考虑如果有人在你的应用程序的城市文本框中输入以下内容会发生什么:

",;从客户中删除-

您最终将构造一个sql字符串,如下所示:

select * from Customers where city = '';DELETE FROM Customers;--'
/*DECLARE @someVariable varchar(12);
  DECLARE @OtherVariable varchar(50);
  DECLARE @thirdVariable int;
  ...*/
var sql = 
"SELECT <columns>
 FROM table t"
 INNER JOIN othertable o ON t.ID = o.tableID"
 WHERE someColumn = @someVariable AND ...";

using (var cn = new SqlConnection(" ... "))
using (var cmd = new SqlCommand(sql, cn))
{
    cmd.Parameters.Add()
    //...
恰好是两条语句和一条注释,您的sql提供程序非常乐意执行这两条语句和注释。现在,数据库连接也可能是以用户身份运行的,没有从该表中删除所需的权限。。。但它可能具有其他特权,例如从其他表读取数据以获取社会保险号码或信用卡之类的信息,或者可能插入具有管理特权的新帐户记录。一个熟练的攻击手几乎可以用它来做任何事情

编写一个简单的转义或净化函数可能会很有诱惑力。不要这样做。首先,它不能完全解决问题。查询参数将用户数据与sql代码完全隔离,因此即使是数据库也总是将用户输入视为变量值,而从不将其直接放入查询字符串中。使用逃逸功能会让你们和黑客展开军备竞赛

另一个原因是性能。数据库很难将查询转化为如何检索数据的执行计划。如此之多,以至于他们经常缓存计划,以查询文本的散列作为键。如果不使用参数化查询,每次都会导致缓存未命中

最后,我发现参数化查询更容易处理。对于复杂的查询,我可能会在查询上方添加注释,如下所示:

select * from Customers where city = '';DELETE FROM Customers;--'
/*DECLARE @someVariable varchar(12);
  DECLARE @OtherVariable varchar(50);
  DECLARE @thirdVariable int;
  ...*/
var sql = 
"SELECT <columns>
 FROM table t"
 INNER JOIN othertable o ON t.ID = o.tableID"
 WHERE someColumn = @someVariable AND ...";

using (var cn = new SqlConnection(" ... "))
using (var cmd = new SqlCommand(sql, cn))
{
    cmd.Parameters.Add()
    //...

这样做的目的是,当需要维护此查询时,我可以快速将查询及其变量声明复制/粘贴到Management Studio或其他查询工具中,完成后,我可以快速将整个混乱移回客户端代码。对于一行程序来说,这并不是什么大问题,真正庞大/复杂的查询通常以存储过程或视图的形式结束,但在这个最佳点上,这确实很有帮助。。结果是,比你想象的更多的事情最终出现在这个甜蜜的地方。

。我敢肯定,通过搜索这个词,你可以在这里找到很多信息。当然,但这是唯一的原因吗?那么,如果它只是一个个人应用,那没什么大不了的?还有其他原因吗,这是一本不错的读物。效率也是如此。如果使用不同的参数值多次运行同一查询,服务器可以编译和缓存查询,然后仅使用新的参数值重新执行查询。搜索参数化查询-搜索非常有用:-太棒了,谢谢!这回答了我的问题,我该如何标记