2011-01-12 106 views
1

我有这样的代码:

ORDER BY $order 

其中“$为了”从URL采取这样的:

http://mywebsite.com/page.php?order=Bananas DESC

可能有人用错误的意向,在末尾加上自己的代码的URL,从而做他们喜欢的任何事情?

+0

这个问题问得好。在这里你可以找到一个白名单示例代码http://stackoverflow.com/questions/2993027/in-php-when-submitting-strings-to-the-db-should-i-take-care-of-illegal-characters/ 2995163#2995163 – 2011-01-12 12:26:56

回答

2

如果您不检查$order变量上的内容,那么您的代码肯定会暴露给潜在的SQL注入攻击。

因此,您需要确保从GET命令得到的内容实际上是有效的order by子句(可以使用正则表达式)来清理输入变量。

或者你可以为你的应用程序做一些编码以形成按子句的顺序。喜欢的东西制作:

http://mywebsite.com/page.php?orderField=1&orderType=DESC 

然后映射在你的代码1BananasorderField参数,ASCDESCorderType参数。

+0

我正在做的唯一检查是查看订单字段是否为空来分配默认订单。除此之外我什么都没有。 我将如何去检查和预防攻击?我有9个可能的'命令'应该被允许。 – Brian 2011-01-12 12:09:22

+0

@Michael - 因此您有一个“白名单”,这是验证输入的正确方法。只需在9个允许的字段中检查最后的变量即可。任务完成! – Jamiec 2011-01-12 12:13:26

2

可能是的。根据您的配置,攻击者可以插入这样的事情:

“香蕉;删除表生”

子查询,而不是多条语句可能可以过

我想无论是建立秩序条款自己,或将其与白名单进行比较。

0

例子:

SELECT * FROM bugs ORDER BY $column $direction 

你必须定义可能的选项:

$column =array('id','name',....); 
$direction = array('ASC','DESC'); 

则:

if(array_key_exists ($_REQUEST['column'],$column){ 
    $column = $column[ $_REQUEST['column'] ]; 
}else{ 
...defaults.... 
}