2013-02-13 167 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。通过这样做,每个我称之为代码的地方都会在发送数据之前负责验证数据。调用代码将知道它正在调用的表的有效可能值(或本例中的视图)。 (在这种情况下,我是两段代码的作者,所以我知道它是安全的。)

所以,简而言之,只要确保代码中此时的值已经清除并且安全,并且将该责任推到一个级别调用此代码的代码。