gpt4 book ai didi

c# - 当它作为字符串出现时,保护完整的 where 语句

转载 作者:太空宇宙 更新时间:2023-11-03 22:48:44 27 4
gpt4 key购买 nike

我有以下 C# 函数

        SomeFunction(string table, string column, string where) { 
Sql sql = new Sql("SELECT ");

// [...] validate table and column values

sql.Append(column);
sql.Append(" FROM ");
sql.Append(table);
sql.Append(" WHERE ");
sql.Append(where); // This is the issue
}

如您所见,这很糟糕,我正在处理这个非常古老的遗留代码并更改函数签名和客户使用它的方式是不可行的。我要做的是保护“where”子句。此子句可能包含任意数量的条件和数据类型。

我有很多想法,但我认为它们不是一个好的解决方案,我认为这需要经过正确编写和测试的代码,但如果我自己突然这样做,它可能会有漏洞。以下是一些想法:

  • 按 char '=' 拆分字符串 -> 如果这不是条件运算符怎么办
  • 查找字符串是否包含分号 -> SELECT 子句仍然存在漏洞,并且可能其中一个条件包含该字符,因此它会给出误报

如果您有任何想法/建议/指向正确的方向,我将不胜感激。

最佳答案

如果 where 子句目前是基于预先编写的 string,那么坦率地说,我不认为这是尝试“安全”的可行方法它。这在理论上是可行的,但如果组合和妥协(注入(inject))的 where 子句是合法的(但滥用),则任何解析 SQL 的尝试都将失败。那时:您已经忘记了最初的意图。这有点像 SQL 注入(inject)的全部要点:生成的 SQL 是有效的 SQL - 所以你很难区分 where Name = 'Fred Orson' -- check name(可能没问题)和 where Name = 'Fred' Or 1=1 --'(注入(inject) - 查询扩展)。

所以:虽然我承认你说:

changing the function signature and the way the clients use it is just not feasible.

更改函数签名并不能真正帮助您解决问题。尝试检测某些模式只是一场军备竞赛,你需要每次都赢,而攻击者只需要赢一次。

如果是我,我会这样做:

[Obsolete("Please specify parameters separately - use 'null' if no parameters are needed")]
SomeFunction(string table, string column, string where) {
return SomeFunction(table, column, where, null);
}
SomeFunction(string table, string column, string where, object args) {
// ...
}

并使用像“Dapper”这样的方法来从 args 参数中组合参数 - 或者只是使用“Dapper”本身来运行查询,并免费使用该功能。

这种方法:

  • 防止添加危险 API 的新用途
  • 让现有代码暂时继续工作
  • 但可以让您通过查看警告来跟踪有多少 Unresolved 问题调用

编辑:注意:args 参数的 是允许调用者参数化他们的输入,即

string name = ...
var users = SomeFunction("Users", "Id", "Name=@name", new { name });

使用 SomeFunction 分解 args 并从 args 的属性中添加参数名称/值对(如果它不为空)。组成参数集的方法有多种,但此处显示的方法简单且易于正确实现 - 这对我来说是一个明显的胜利。

关于c# - 当它作为字符串出现时,保护完整的 where 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48621007/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com