0

我是一個新手程序員,我繼承了一個由現在離開公司的人設計和構建的應用程序。它在PHP和SQL Server 2008R2中完成。在這個應用程序中,有一個頁面,其中有一個表格顯示項目列表,從數據庫填充,在側欄中有一些過濾器選項 - 按ID,關鍵字,日期等進行搜索。此表由一個龐大的查詢填充,通過將它們連接到所述查詢來應用過濾器。例如,如果有人想項目#131:搜索選項的SQL連接的替代方法?

$filterString = "Item.itemID = 131"; 
$filter = " AND " . $filterString; 

SELECT ... 
FROM ... 
WHERE... 
$filter 

過濾器被包括在搜索頁面的URL的結尾。這不是很好,我相當肯定有一些SQL注入漏洞的結果,但它非常靈活 - 過濾字符串是在它被共享之前創建的,並且可以有許多不同的條件:例如$ filterString可能是「條件AND條件AND coindtion OR條件」。

我一直在尋找存儲過程,作爲一種更好的方法來解決SQL注入問題,但我還沒有任何運氣如何複製這種相同級別的靈活性。我不知道提前選擇哪個過濾器(如果有的話)。

有什麼我失蹤了嗎?

回答

2

使用支持準備/參數化查詢的Mysqli或PDO來對抗sql注入。在PDO這可能是這個樣子

$conditions = ''; 
$params = array(); 

if(isset($form->age)) { 
    $conditions .= ' AND user.age > ?' 
    $params[] = $form->age; 
} 

if(isset($form->brand)) { 
    $conditions .= ' AND car.brand = ?' 
    $params[] = $form->brand; 
} 

$sql = " 
    SELECT ... 
    FROM ... 
    LEFT ... 
    WHERE $conditions 
    "; 

$sth = $dbh->prepare($sql); 
$sth->execute($params); 

$result = $sth->fetchAll(); 

從手冊:

調用PDO ::準備()和PDOStatement對象::執行()的語句會發出多次通過允許驅動程序協商查詢計劃和元信息的客戶端和/或服務器端緩存,並通過不需要手動引用參數來幫助防止SQL注入攻擊,通過不同的參數值優化應用程序的性能。

http://no1.php.net/manual/en/pdo.prepare.php