2014-02-14 73 views
0

我有簡單的jTable jQuery網頁。 由於我在前面的主題中沒有收到太多回復: Safe MySQL password on shared hosting,我已經開始自行研究。 我使用基於PHP的腳本進行MySQL連接,並使用分頁。 從我研究的內容來看,沒有用戶輸入數據的查詢不會被黑客傷害,除非直接訪問和/或替換PHP文件。所以我決定把它放在我的網站根目錄之上。 我已經爲jTable添加了分頁功能,它使用SQL查詢和一些來自JS腳本的輸入數據。 爲了上帝的緣故,我決定保護這個查詢免受任何惡意SQL注入的影響。PHP分頁安全

查詢:

"SELECT * FROM people LIMIT " . $_GET["jtStartIndex"] . "," . $_GET["jtPageSize"] . ";" 

我做什麼我已經添加強制類型轉換來詮釋,爲前:

"SELECT * FROM people LIMIT " . (int)$_GET["jtStartIndex"] . "," . (int)$_GET["jtPageSize"] . ";" 

是否足夠安全? 據我記得,任何將會去那裏的字符串將被(int)cast解析爲0。

+2

使用mysqli或pdo與準備好的語句以 –

+0

開頭不,它不安全。 '按7號順序',而且沒有什麼意義。 –

+0

不會從'order by 7'轉換爲int,因爲我們先有字母給出0? – mwilczynski

回答

1

有些人認爲準備好的聲明是唯一能夠安全地處理sql注入的方法,但事實並非如此,做一個手動過濾器也是有效的(但是冗長)。

在這種情況下是優良的解決方案,但它可能是包裝物(例如,用於捕獲錯誤)

<?php 
// this function is not needing unless it is used recurrently. 
function safe_get_int($value) { 
    return intval(@$_GET[$value]); 
} 
$init= safe_get_int("jtStartIndex") ; 
$page= safe_get_int("jtPageSize") ; 
if (($init>0 && $init<=9999) && ($page>0 && $page<100)) { 
    $sql = "SELECT * FROM people LIMIT {$init},{$page};"; 
} else { 
    $sql = "SELECT * FROM people LIMIT 0,20;"; // standard value 
} 
?> 

結果:

輸入號碼=返回數量。

輸入文本=返回零。

輸入特殊字符=返回零。

缺少值=返回零。 (這就是爲什麼我加了@)。

輸入一個負數=它被認爲是一個零值。

(已添加),輸入大號也受到限制。例如,大頁面大小可能會導致某些服務器崩潰。

+0

它比(int)更好嗎? –

+1

最好使用'isset'與'@'錯誤抑制器。($ value){ return isset($ _ GET [$ value])? (int)$ _ GET [$ value]:0; }' –

+0

通常(int)更快,我只是因爲可讀性而使用intval。 – magallanes