Ordinamento SQLSRV di PHP con il parametro dell'istruzione preparata

Non riesco a capire perché l'sorting funzioni finché non utilizzo $ sort come parametro passato. Esempio di seguito functionrà per l'sorting:

$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 = arrays( $pagify['startFrom'], $end, $available, $available ); $stmt = sqlsrv_query( $conn, $sql, $params ); 

Tuttavia se cambio la linea con ORDER BY a:

 ORDER BY (?) 

e aggiungilo ai miei $ param in questo modo:

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

quindi il tipo per qualche motivo viene ignorato.

Per favore dimmi come far funzionare l'sorting in modo da non consentire l'iniezione SQL.

Mi sto occupando di questo problema esatto in questo momento e non riesco a trovare nulla online per aiutare.

Ho provato:

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

e

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

In entrambi i casi, non ho alcun errore e nessun risultato.

Penso che l'unico modo per risolverlo in modo sicuro sia usare una dichiarazione switch prima della query per validare manualmente i valori accettabili. Tuttavia, a less che tu non abbia a che fare solo con una tabella, non puoi sapere quali sono i possibili valori per la colonna SortBy.

Tuttavia, se si va solo supponendo che i valori a questo punto siano già stati puliti, si può andare con la versione non parametrizzata in questo modo:

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

Quello che ho intenzione di fare è assicurarmi di validationre sortBy e sortOrder prima di passarli al metodo che contiene questo codice. In questo modo, each luogo che chiamo il codice diventa responsabile della validation dei dati prima di inviarli. Il codice chiamante conoscerebbe i valori validi possibili per la tabella (o la vista in questo caso) che sta chiamando. (Sono autore di entrambi i pezzi di codice in questo caso, quindi so che è sicuro).

Quindi, in breve, assicurati solo che i valori a questo punto nel codice siano già puliti e sicuri e spinga questa responsabilità su un livello del codice che chiama questo codice.