用户MySQL查询的强制限制

时间:2012-11-04 00:02:04

标签: php mysql pdo limit

所以我有一个区域,人们可以针对我的数据库编写自己的查询,但我想限制返回的结果(很像PhpMyAdmin)。

所以我需要检查$_POST['query']以查看是否有限制声明,如果有,请确保它低于30,比如说。如果没有限制,我需要添加它。

我该怎么做?

2 个答案:

答案 0 :(得分:4)

忽略风险......我认为最好的方法是将查询用作子查询并应用限制。所以你要避免评估查询。

SELECT * 
FROM (
 SELECT * 
 FROM 'table'
 LIMIT 0 , 100
) AS query

LIMIT 0 , 30

答案 1 :(得分:1)

您可以使用preg_*函数检查查询并注入首选限制。

编辑:我完全忽略了LIMIT关键字的可能用途。这是编辑过的版本。

$query = 'SELECT * FROM aa LIMIT 100,20';
$limit = 20; // predefined max limit

// possibilities:
// LIMIT N[,N]
// LIMIT N OFFSET N

preg_match('~(?<=\blimit\s)\s*(?<limit>\d+)\s*(,\s*\d+|\soffset\s+\d+)?\s*$~i',$query,$limitStr);
if (isset($limitStr['limit'])) {
    $maxLimit = min((int)$limitStr['limit'],$limit);
    // user might have already limited it so this is
    // just to make sure it does not exceed your max.
    $query = preg_replace('~(?<=\blimit\s)\s*\d+\s*(,\s*\d+|\soffset\s+\d+)?\s*$~i',$maxLimit.'$1',$query);
} else $query .= " LIMIT $limit";

echo $query;

将输出SELECT * FROM aa LIMIT 20,20