【发布时间】:2018-07-15 05:12:24
【问题描述】:
我有以下 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 子句仍然容易受到攻击,并且可能其中一个条件包含该字符,因此它会给出误报
如果您有任何想法/建议/指出正确的方向,我将不胜感激。
【问题讨论】:
-
请注意,
table和column也是 攻击媒介,除非您明确声明它们是可信值。 -
获取where clause 并阅读它的整个文档(它接受的谓词),并以此为基础。
-
还有
in、>、<、like等。此外,不同的数据库可能支持不同的东西——例如 MySql 支持(col1, col2) in (value1, value2)而 SQL Server 会抛出语法错误。有多少客户端可以运行此方法? -
这非常复杂,因为您必须(基本上)解析任意表达式,这比转义值要困难得多。确定结果语句是否至少是一条语句相当容易,但这也不能完全防止 SQL 注入,因为它仍然可以选择任意表和列(包括系统表、用户帐户等)。首先,尝试 非常很难以不易受攻击的方式限制输入。特别是,用户实际上如何使用
WHERE?他们实际访问的是哪些表?
标签: c# where sql-injection where-clause sanitization