我们有一个SQL语句,它使用SqlBuilder在from子句中设置表名。数据库是Server 2008及以上版本。
var sqlBuilder = new SqlBuilder();
sqlBuilder.Select("*").From(tableName);
sqlBuilder.Where("...");
Connection.BuilderQuery<dynamic>(sqlBulder).Select(Map);我想知道这是否是SQL注入的风险?我怎样才能减轻这种风险?或者SqlBuilder会处理这些事情吗?
我是否可以简单地将表名包装在方括号中来降低风险?例如:
sqlBuilder.From("[" + tableName + "]");此外,如果有人能在FROM子句中提供一些SQL注入攻击的示例,以便我能够理解它的工作原理并创建测试,这将是非常感谢的。
发布于 2015-05-19 21:28:12
我不知道SqlBuilder是什么,但是这里有一个利用注入的例子:假设您有一个代码:
var myFullQuery = string.Format("SELECT * FROM {0} WHERE A = 1", externalInput);然后对数据库执行此操作。如果恶意用户将此字符串作为输入发送:ValidTableName; DELETE FROM ValidTableName; SELECT * FROM ValidTableName
myFullQuery变量将被设置为:SELECT * FROM ValidTableName; DELETE FROM ValidTableName; SELECT * FROM ValidTableName WHERE A = 1,您丢失了整个表.显然,可以用这种方式实现更多的卸载命令.
发布于 2015-05-19 21:59:46
从问题中的信息来看,不清楚代码是否易受攻击。SqlBuilder对象不太可能以一种安全的方式处理表名,但是在我们知道SqlBuilder的确切细节之前,我们无法确定它是.Net框架的一个标准部分。我们还需要更多地了解tableName变量,因为即使是不安全的SqlBuilder实现也可以使用表名的安全源。
我可以肯定地说,使用方括号提出的修复方法并不是解决问题,而是解决问题。鉴于这一守则:
sqlBuilder.From("[" + tableName + "]");我仍然可以提供这样的输入:
Information_schema.columns];删除表x;从[y ]中选择*
中间的部分还会被注射和执行。
而且,看起来您可能正在使用以下内容:
https://github.com/maxtoroq/DbExtensions/blob/master/docs/SqlBuilder.md
如果是这样的话,在查看了该类型的文档之后,您应该注意到,对于表名来说,这绝对是不安全的,并且很可能是用MySql编写的(它使用了LIMIT子句,这是对SQL的一个非标准的MySql扩展)。
发布于 2015-05-19 22:05:30
或者
SqlBuilder会处理这些事情吗?
不是的。你必须正确地使用这种技术来保护自己。就像有一辆带安全带的汽车一样,只有当你使用得当时,你才会受到保护。
我想知道这是否是SQL注入的风险?
也许吧。如果在终端用户数据上使用任何类型的数据,则很可能是肯定的。如果您必须询问您的最终用户想要填充哪个表,我建议您使用枚举。带有字符串标题和int值的下拉框;
public enum WhitelistTable
{
Undefined = 0,
MyTable1,
MyTable2
}如果用户数据不是int,则该数据无效。您可以在每个枚举值上放置一个DescriptionAttribute,也可以简单地.ToString()枚举值并插入该值。有影响力的白名单比黑名单好。
var myTable = WhitelistTable.MyTable1;
sqlBuilder.From(myTable.ToString());我是否可以简单地将表名包装在方括号中来降低风险?
我不这么认为,一般不会(我对SqlBuilder不是百分之百肯定)。我甚至不会依靠第三方的消息来源来冒险。示例值:
[ SomeTable];下拉表SomeTable;--
产量:
sqlBuilder.From("[SomeTable]; Drop Table SomeTable; --]");https://stackoverflow.com/questions/30336297
复制相似问题