Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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
C# SQL注入缺陷_C#_Sql Server_Sql Injection - Fatal编程技术网

C# SQL注入缺陷

C# SQL注入缺陷,c#,sql-server,sql-injection,C#,Sql Server,Sql Injection,我正在从事一个项目,客户机报告代码中存在SQL注入缺陷。这是我的密码 1 public int ExecuteNonQuery(string query, SqlParameter[] parameters) 2 { 3 using (SqlCommand command = CreateCommand(query, parameters)) 4 { 5 int rowsAffected = command.ExecuteNonQuery(); 6 return

我正在从事一个项目,客户机报告代码中存在SQL注入缺陷。这是我的密码

1 public int ExecuteNonQuery(string query, SqlParameter[] parameters)
2 {
3   using (SqlCommand command = CreateCommand(query, parameters))
4   {
5       int rowsAffected = command.ExecuteNonQuery();
6       return rowsAffected;
7   }
8 }
CreateCommand方法如下所示

private SqlCommand CreateCommand(string commandText, SqlParameter[] parameters)
{
    SqlCommand retVal = this.connection.CreateCommand();
    retVal.CommandText = commandText;
    retVal.CommandTimeout = this.commandsTimeout;
    retVal.Parameters.AddRange(parameters);
    return retVal;
}
该缺陷报告在第3行。我无法理解这里会发生什么样的攻击,因为这是一个控制台应用程序。但是我必须修复这个缺陷,我不知道如何修复它

疑问是

@"delete from {0} where runId in 
( select runId from {0}
  inner join 
    ( select sId as sId_last,
        wfId as wfId_last,
        max(runId) as runId_last from {0} where endTime is NULL
        group by sId, wfId ) t1
  on endTime is NULL and sId = sId_last and wfId = wfId_last
  and (runId <> runId_last or startTime < @aDateTime)
)";
谢谢你的帮助。 谢谢。

那代码是免费的。。。但是请注意,调用ExecuteOnQuery的方法可以通过组合字符串来构建查询

执行以下操作时会发生注射攻击:

string name = ...; // A name selected by the user.
string query = "SELECT * FROM MyTable WHERE Name = '" + name + "'";
string tableName;

if (foo)
   tableName = "Foo";
else if (bar)
   tableName = "Bar";
因此,当您使用外部来源的文本片段组合查询时

请注意,更微妙的注入攻击可能是多层次的:

string name = // The result of a query to the db that retrieves some data
              // sadly this data has been manipulated by the attacker

string query = "SELECT * FROM MyTable WHERE Name = '" + name + "'";
一般来说,您不需要用户界面来引起注入攻击

您可以从网站/数据库中查询某些内容,并使用未初始化的结果来查询数据库,如上一个示例所示,从而导致注入攻击。。。甚至使用配置文件的内容也可能导致注入攻击:修改配置文件所需的权限可能与在数据库上执行操作所需的权限不同,恶意用户可能拥有修改配置文件的权限,但无法直接访问数据库。所以他可以用这个程序作为对付DB的特洛伊木马

关于查询

由字符串组成的查询的弱点在于{0}的计算方式。它是在一组固定字符串中选择的字符串吗?比如:

string name = ...; // A name selected by the user.
string query = "SELECT * FROM MyTable WHERE Name = '" + name + "'";
string tableName;

if (foo)
   tableName = "Foo";
else if (bar)
   tableName = "Bar";
还是更受用户控制

如果表名在代码中是固定的,那么就不可能有任何注入攻击。如果表名是从某个用户输入/某个用户可以访问的其他表中提取出来的,那么我们将返回到我之前显示的问题。

您已经公开了一个公共方法,该方法可以被允许执行任何SQL表达式的任何代码访问

我将考虑将该方法改为内部方法或私有方法,以便不仅仅是任何代码都可以调用该方法。

第3行:

 using (SqlCommand command = CreateCommand(query, parameters))
查询和参数都可在此行中使用

不应通过尝试验证输入来阻止SQL注入;相反,应该在将输入传递到数据库之前对其进行正确转义

如何转义输入完全取决于您使用什么技术与数据库接口

使用准备好的语句和参数化查询。这些是SQL 发送到数据库服务器并由数据库服务器解析的语句 与任何参数分开。这样的话,一个人是不可能的 攻击者试图注入恶意SQL


供您参考。

您了解什么是SQL注入吗?是的,我了解。问题是它不是一个基于web的应用程序。这是一个控制台应用程序,没有任何文本字段可在其中输入数据。发布查询..可能存在循环hole@utility:我已经发布了答案的查询库,但是如何验证查询。我还需要验证参数吗?@NJMR SqlParameter是安全的。注入攻击仅针对查询的文本部分。请注意,还有一系列攻击,例如,用户发现如何通过Id直接查询,并且能够查询他不应该查询的信息。。。例如,假设您的站点有如下地址:http://mysite.xxx/user/123 其中123是用户的id。用户可以尝试编写http://mysite.xxx/user/200 看看会发生什么。。。但正如我所说,这是另一类攻击。值得一提的是,参数化查询并不是100%安全的,如果查询对参数做了愚蠢的操作,这些查询仍然容易受到注入攻击。我见过一个存储过程,它将参数连接到字符串查询中,例如SET@query='SELECT*FROM foo,其中name像%'+@term+'%'。非常愚蠢,但它发生的次数比你想象的要多。@DGibbs是的。。。我差点忘了!如果您使用EXEC执行某些操作,则可能会遇到麻烦:-