基本上,我想做的是:
mysql_query("SELECT ... FROM ... ORDER BY $_GET[order]")
很明显,他们可以通过在其中放置无意义的语句来轻松地创建SQL错误,但mysql_query
只允许您执行1个查询,因此他们不能放置类似1; DROP TABLE ...
的语句。
除了产生语法错误之外,恶意用户还会造成什么损害吗?
如果是,我该如何清理查询?$_GET['order']
变量有很多类似SQL的语法,所以我真的不想更改格式。
为了澄清,$_GET['order']
不仅仅是一个字段/列。它可能类似于last_name DESC, first_name ASC
。
5条答案
按热度按时间rqcrx0a61#
是的,SQL注入攻击可以使用未转义的ORDER BY子句作为向量。这里有一个关于如何利用这一点以及如何避免这一问题的解释:
http://josephkeeler.com/2009/05/php-security-sql-injection-in-order-by/升
该博客文章建议使用白名单来验证ORDERBY参数,这几乎可以肯定是最安全的方法。
为了响应更新,即使子句很复杂,您仍然可以编写一个例程,根据白名单验证它,例如:
即使ORDERBY子句很复杂,它仍然只由您提供的值组成(假设您不允许用户手动编辑它)。您仍然可以使用白名单进行验证。
我还应该补充一点,我通常不喜欢在URL或UI中的其他位置公开我的数据库结构,我经常会在URL中的参数中使用别名,并使用哈希将其Map到实际值。
8dtrkrch2#
不要指望此时的SQL注入目前不会导致问题;不允许任何SQL注入。如果没有别的,恶意攻击者可能会定义一个非常复杂的顺序,这可能会导致数据库严重减速。
e3bfsja23#
我更喜欢做白名单,并将http参数字符串与插入到SQL查询中的字符串分开。
在下面的PHP示例中,数组键将是作为http参数传入的值,根据您的web界面,这是不同排序方案的某种符号标签。数组值将是我们希望为这些对应的排序方案(例如列名或表达式)插入SQL中的值。
这具有以下优点:
我在我的演示文稿SQL Injection Myths & Fallacies和我的书SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming中介绍了这个解决方案。
u1ehiz5o4#
围绕变量
$_GET['order']
构建的逻辑在用于变量m1on1o1p时应该同样有效。为什么不首先清理输入,然后执行逻辑,使其适合SELECT
语句?xpcnnkqh5#
它仍然是潜在的SQL注入点。您依赖于
mysql_query
的内部实现。如果在更高版本中,他们将其更改为使用多个查询,该怎么办?您可以使用
mysql_real_escape_string
。