我有需要你的帮助。 目前,我使用ado.net构建了一个asp.net应用程序。我正在使用CommandText来构建动态查询,因此它具有SQL注入漏洞。 我的CommandText就像这样
String.Format("SELECT COUNT(*) FROM {0} {1}", tableName, whereClause)
TableName和whereClause由开发人员传入。如你所见,我不能在这里使用SQLParameters,因为我需要传递整个tableName和whereClause,而不仅仅是参数值。
我的防止SQL注入的解决方案是使用BlackList检查TableName和whereClause来查找恶意字符串,但我不知道这是在这种情况下最好的方法,不是吗。如果是这样,任何人都可以帮助我找到BlackList引用或库。
答案 0 :(得分:2)
在不了解更多详细信息的情况下,您可以使用多种方法来避免SQL注入攻击或至少将可能造成的损害降至最低:
sys.tables
系统表来检查所提供的表名是否存在于数据库中(在SQL Server中,其他DBMS可能具有类似的表)。在此查询中,您可以使用参数以确保安全。 SELECT COUNT(*) FROM [" + tableName + "]"
)中。方括号用于分隔标识符(另请参阅此link)。为此,您必须检查tableName
变量是否包含结束方括号。如果tableName
变量可能包含模式标识符(例如dbo.MyTable
,则必须首先拆分部分,然后添加方括号([dbo].[MyTable]
),因为它们是单独的标识符(一个用于架构,一个用于表名称。)WHERE
子句很难,因为你基本上必须解析SQL WHERE子句并声明不包含危险代码。 WHERE
子句。同样在这方面,如果您可以限制用户的选项并将可能的WHERE
子句列入白名单,那将是最好的。这意味着用户可以根据用户输入从程序知道或构建的一系列WHERE
子句中进行选择。这些已知的WHERE
子句可以包含参数,因此可以安全地防止SQL注入攻击。如果您不能将WHERE
子句列入白名单,则必须解析WHERE
子句才能确定某个请求是否有危险。这需要付出很大的努力(如果你找不到可以为你做这个的库),那么我会尝试将尽可能多的动态查询部分列入白名单。 最后一点想法:即使为开发人员提供这样一种查询数据的开放方法似乎很容易,也要考虑是否真的有必要。一种可能的选择是不具有此开放访问权限,而是配置其他开发人员在配置文件中需要的查询。每个查询都获得一个标识符,查询文本存储在文件中,因此事先已知。您仍然可以在部署服务后添加新查询或更改现有查询。您可以在查询中允许调用者指定的参数(可能是编号参数方案,如p1,p2,...)。
从上面的列表中可以看出,一旦允许这种开放访问,就很难(并且在某些方面几乎不可能)锁定服务并避免各种SQL注入攻击。使用上一段中描述的方法,您会失去一些灵活性,但您不必再担心SQL注入攻击了。