ЗАКАЗАТЬ по переменным вопросам - PullRequest
1 голос
/ 29 февраля 2012

У меня проблемы с передачей переменной в ORDER BY в запросе MSSQL (через PHP), здесь код:

    <?php
include "connection.php";
$type = $_POST['type'];
$order = $_POST['order'];
$data = $_POST['data'];

$params="@order varchar(10)";
$paramslist="@order=$order";

$sql = "SELECT * FROM Customer ORDER BY "+@order;
$dbsql = "EXEC sp_executesql
N'$sql',
N'$params',
$paramslist";
$result = sqlsrv_query($link, $dbsql);
if ($result) {
echo "OK";
} else {
echo "FAIL - " . $order . " -- ";
die(print_r(sqlsrv_errors(), true));
}
?>

В браузере отображается следующая ошибка:

FAIL - CompanyName - Массив ( [0] => Массив ( [0] => 42000 [SQLSTATE] => 42000 [1] => 102 [code] => 102 [2] => [Microsoft] [Собственный клиент SQL Server 10.0] [SQL Server] Неверный синтаксис рядом с «0». [message] => [Microsoft] [Собственный клиент SQL Server 10.0] [SQL Server] Неверный синтаксис рядом с «0». ) )

Проверок на данный момент:

  • Все переменные POST имеют необходимые данные
  • правильное имя таблицы SQL и данные в $ order равны правильному имени столбца

Я искал вокруг, но не могу найти ничего слишком полезного, кто-нибудь может помочь?

Спасибо.

EDIT:

Хорошо, теперь код:

$params="@order varchar(10)";
$paramslist="@order=$order";
$sql = "SELECT * FROM Customer ORDER BY ".$order;
$dbsql = "EXEC sp_executesql
N'$sql',
N'$params',
$paramslist";
$result = sqlsrv_query($link, $dbsql);

И это работает нормально, но оставляет ли это его открытым для атак с использованием SQL-инъекций? Есть ли лучший способ выполнить этот запрос?

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 29 февраля 2012

Вы можете справиться с Sql Injection, используя код для заказа, например, Вы отправляете обратно себе 1, 2, 3, 4 и т. д., которые преобразуются в код, чтобы получить правильное имя столбца. Если опубликованный код не соответствует вашему поиску, вы игнорируете его.

0 голосов
/ 29 февраля 2012

Вы пробовали использовать

$sql = "SELECT * FROM Customer ORDER BY  @order";

Так как это не работает, лучший способ - использовать подготовленные утверждения, я думаю

$stmt = $dbh->prepare("SELECT * FROM Customer  WHERE value = ? ORDER BY ?");
if ($stmt->execute(array($_POST['value'], $_POST['order']))) {
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...