【问题标题】:How does Command.Parameters.Add() prevent SQL injection? C# [duplicate]Command.Parameters.Add() 如何防止 SQL 注入? C# [重复]
【发布时间】:2017-05-08 07:57:19
【问题描述】:

我现在已经阅读了很多关于 SQL 注入并试图阻止它的信息。我看过几篇关于如何以及为什么使用的文章

Command.Parameters.Add()

like explained here.

但我仍在寻找如何以及为什么阻止 SQL 注入的答案。

MSDN 没有关于这方面的太多信息。

这是我如何使用它的示例:

SqlCommand myCommand = new SqlCommand("SELECT * FROM table WHERE name = @name ", myConnection);
myCommand.Parameters.Add("@name", SqlDbType.NVarChar, 20).Value = "MaMu2";

我的代码对 SQL 注入是否安全,还是我错了?

编辑:主要问题是:它是如何在内部工作的?

【问题讨论】:

标签: c# sql-server sql-injection


【解决方案1】:

短版: 基本上,sql 引擎会将 sql 参数作为值的占位符。
这意味着即使您的@Name 参数是name';drop table tableName;--,您最终也会得到这样的查询:

SELECT * FROM table WHERE Name = 'name'';drop table tableName;--'

相对于如果您将连接字符串来创建 sql - 这将创建如下查询:

SELECT * FROM table WHERE Name = 'name';drop table tableName;--

如您所见,第一个查询是安全的,而第二个则不是。它允许您将有害代码添加到您的 sql。

如果您使用参数,您的有害代码将不会被视为代码。
重要提示:如果您将参数发送到使用这些参数创建和运行的存储过程动态 sql,你仍然不安全 - 因为它在存储过程中连接字符串。

附带说明一下,某些数据库引擎(例如 oracle)在每次执行时只允许一个命令,但仍然可以使用 name' OR 1=1 进行黑客攻击,这将创建

SELECT * FROM table WHERE Name = 'name' OR 1=1

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 2022-01-18
    • 2016-08-04
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2017-11-22
    • 2011-08-08
    相关资源
    最近更新 更多