所以我有一個區域,人們可以根據自己的數據庫編寫自己的查詢,但是我想限制返回的結果(很像PhpMyAdmin)。用戶MySQL查詢的強制限制
因此,我需要檢查$_POST['query']
,看看是否有限制聲明,如果有,確保它在30以下,說。如果沒有限制,我需要添加它。
我該怎麼做?
所以我有一個區域,人們可以根據自己的數據庫編寫自己的查詢,但是我想限制返回的結果(很像PhpMyAdmin)。用戶MySQL查詢的強制限制
因此,我需要檢查$_POST['query']
,看看是否有限制聲明,如果有,確保它在30以下,說。如果沒有限制,我需要添加它。
我該怎麼做?
可以使用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
忽略風險......我認爲最好的做法是將查詢用作子查詢並應用限制。所以你避免評估查詢。
SELECT *
FROM (
SELECT *
FROM 'table'
LIMIT 0 , 100
) AS query
LIMIT 0 , 30
Oooh中選擇count(*),我想到Regex,但這是一個更優雅的解決方案。但是,我認爲每個讀這個問題的人都認爲這很瘋狂。 –
除非檢查(和修改)由正則表達式模式,大家都知道,這是非常** **危險的,對不對? – inhan
除了解析查詢並將限制放入它之外沒有別的辦法..但即使這樣做也無法保證,因爲您有限制無效的情況。例如,如果他們從表' –