在MSSQL查询中将变量传递给ORDER BY(通过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[代码]=>102[2] =>[Microsoft][SQL Server Native Client 10.0][SQL Server:"0"附近的语法不正确。[message]=>[Microsoft][SQL Server Native Client 10.0][SQL Server:"0"附近的语法不正确。))
到目前为止的检查:
- 所有POST变量都具有所需的数据
- SQL表名正确,$order中的数据等于正确的列名
我到处找了找,但找不到任何有用的东西,有人能帮忙吗?
谢谢。
编辑:
好的,所以代码现在是:
$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注入攻击吗?有什么更好的方法来执行这个查询吗?
感谢您的帮助。
您可以通过使用订单的代码来处理Sql注入,例如,您向自己发布1、2、3、4等,这些代码在代码中转换为正确的列名。如果发布的代码与您的查找不匹配,则忽略它。
您尝试过使用吗
$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);
}
}