2012-11-04 99 views
0

所以我有一個區域,人們可以根據自己的數據庫編寫自己的查詢,但是我想限制返回的結果(很像PhpMyAdmin)。用戶MySQL查詢的強制限制

因此,我需要檢查$_POST['query'],看看是否有限制聲明,如果有,確保它在30以下,說。如果沒有限制,我需要添加它。

我該怎麼做?

+2

除非檢查(和修改)由正則表達式模式,大家都知道,這是非常** **危險的,對不對? – inhan

+0

除了解析查詢並將限制放入它之外沒有別的辦法..但即使這樣做也無法保證,因爲您有限制無效的情況。例如,如果他們從表' –

回答

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

4

忽略風險......我認爲最好的做法是將查詢用作子查詢並應用限制。所以你避免評估查詢。

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

LIMIT 0 , 30 
+1

Oooh中選擇count(*),我想到Regex,但這是一個更優雅的解決方案。但是,我認爲每個讀這個問題的人都認爲這很瘋狂。 –