我正在处理一个项目,客户报告代码中存在 SQL 注入(inject)缺陷。这是我的代码……
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)
)";
感谢帮助。 谢谢。
最佳答案
那个代码是无注入(inject)的...但是请注意,调用ExecuteNonQuery
的方法可以通过组合字符串来构建查询
。
当您执行以下操作时会发生注入(inject)攻击:
string name = ...; // A name selected by the user.
string query = "SELECT * FROM MyTable WHERE Name = '" + name + "'";
因此,当您使用来自外部的文本片段编写查询时。
请注意,更微妙的注入(inject)攻击可能是多层次的:
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 + "'";
一般来说,你不需要用户界面来引起注入(inject)攻击......
您可以从网站/数据库中查询某些内容,并使用未经过滤的结果来查询数据库(如上一个示例),从而导致注入(inject)攻击……甚至使用配置文件的内容也可能导致注入(inject)攻击:修改配置文件所需的权限可能与在数据库上执行某些操作所需的权限不同,恶意用户可能拥有修改配置文件的权限但不能直接访问数据库。所以他可以将该程序用作针对 DB 的特洛伊木马。
关于查询
该查询(即字符串的组合)的弱点在于 {0}
的计算方式。是在一组固定字符串中选出的字符串吗?像这样的东西:
string tableName;
if (foo)
tableName = "Foo";
else if (bar)
tableName = "Bar";
还是更多用户控制的东西?
如果表名在代码中是固定的,那么应该不会有任何注入(inject)攻击的可能。如果表名是从某些用户输入/用户可以访问的某些其他表中“提取”的,我们将返回到我之前展示的问题。
关于c# - SQL注入(inject)漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30457272/