2013-02-13 107 views
2

的參數挑選我想不通爲什麼排序,因爲我沒有使用$排序作爲參數傳遞將只要工作。下面的例子將分揀工作:PHP SQLSRV與預處理語句

$sort = "quantity desc"; 

$sql = " with items as (
SELECT i.[item_id] 
,i.[name] 
,i.[value] 
,i.[quantity] 
,i.[available] 
,isnull(r.awarded, 0) as awarded 
, ROW_NUMBER() OVER(
    ORDER BY $sort 
) rowNumber 
FROM [Intranet].[dbo].[Goodwell_Item] i 
LEFT JOIN (
SELECT r.item_id 
, COUNT(1) awarded 
from [Intranet].[dbo].[Goodwell_Reward] r 
group by r.item_id 
) as r 
ON i.item_id = r.item_id 
) 
SELECT * 
FROM items 
WHERE rowNumber BETWEEN (?) and (?) 
and ((?) = '' OR (available = (?))) 
"; 

$params = array($pagify['startFrom'], $end, $available, $available); 

$stmt = sqlsrv_query($conn, $sql, $params); 

但是,如果我改變符合ORDER BY到:

ORDER BY (?) 

,並把它添加到我的$ PARAMS像這樣:

$params = array($sort, $pagify['startFrom'], $end, $available, $available); 

然後由於某種原因的排序被忽略。

請告訴我如何得到排序的方式,不允許SQL注入工作。

回答

0

我處理這個確切的問題,現在,找不到任何在線幫助。

我曾嘗試:

$query = "SELECT * FROM {$this->view} WHERE SeriesID = ? ORDER BY ? "; 
$result = $conn->getData($query, array($seriesID,$sortBy)); 

$query = "SELECT * FROM {$this->view} WHERE SeriesID = ? ORDER BY ? ?"; 
$result = $conn->getData($query, array($seriesID,$sortBy,$sortOrder)); 

在這兩種情況下,我沒有得到任何錯誤,也沒有結果。

我想安全地解決這個問題的唯一方法是使用一個開關語句的查詢之前手工驗證其可接受的值。但是,除非你永遠只用一個表打交道時,你可以不知道什麼可能的值都爲SortBy列。

但是,如果你只是在假設在這一點上的值已經被清理走了,你可以用非參數化的版本是這樣走:

$query = "SELECT * FROM {$this->view} WHERE SeriesID = ? ORDER BY " . $sortBy . " " . $sortOrder; 
$result = $conn->getData($query, array($seriesID)); 

我打算做的是使在將它們傳遞給包含此代碼的方法之前,確保驗證sortBy和sortOrder。通過這樣做,每個我稱之爲代碼的地方都會在發送數據之前負責驗證數據。調用代碼將知道它正在調用的表的有效可能值(或本例中的視圖)。 (在這種情況下,我是兩段代碼的作者,所以我知道它是安全的。)

所以,簡而言之,只要確保代碼中此時的值已經清除並且安全,並且將該責任推到一個級別調用此代碼的代碼。