首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL注入缺陷

SQL注入缺陷
EN

Stack Overflow用户
提问于 2015-05-26 11:29:37
回答 3查看 281关注 0票数 4

我正在处理一个项目,客户端报告了代码中的SQL注入缺陷。这是我的代码…

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

代码语言:javascript
复制
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行处。我无法理解这里发生了什么样的攻击,因为这是一个控制台应用程序。但我必须修复这个缺陷,我不知道如何修复它。

查询是

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

帮助感激。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-26 11:33:48

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

我将考虑将该方法改为internalprivate,这样任何代码都可以调用该方法。

票数 2
EN

Stack Overflow用户

发布于 2015-05-26 11:31:59

密码是免费的.但是请注意,调用ExecuteNonQuery的方法可以通过组合字符串来构建query

当您执行以下操作时,就会发生注入攻击:

代码语言:javascript
复制
string name = ...; // A name selected by the user.
string query = "SELECT * FROM MyTable WHERE Name = '" + name + "'";

因此,当您使用外部来源的文本片段编写查询时。

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

代码语言:javascript
复制
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 (如上一个示例所示),从而导致注入攻击.甚至使用配置文件的内容也可能导致注入攻击:修改配置文件所需的权限可能与在DB上执行某些操作所需的权限不同,恶意用户可能拥有修改配置文件的权限,但不能直接访问DB。所以他可以用这个程序作为特洛伊木马来对抗DB。

关于查询

该查询(即字符串组合)的缺点在于如何计算{0}。它是在一组固定字符串中选择的字符串吗?类似于:

代码语言:javascript
复制
string tableName;

if (foo)
   tableName = "Foo";
else if (bar)
   tableName = "Bar";

或者是更受用户控制的东西?

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

票数 5
EN

Stack Overflow用户

发布于 2015-05-26 11:38:28

第3行:

代码语言:javascript
复制
 using (SqlCommand command = CreateCommand(query, parameters))

在这一行中,查询和参数都可用。

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

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

使用准备好的语句和参数化查询。这些SQL语句是数据库服务器与任何参数分别发送和解析的SQL语句。这样,攻击者就不可能注入恶意SQL。

关于SQL注入的课程供您参考.link2

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

https://stackoverflow.com/questions/30457272

复制
相关文章

相似问题

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