我有一个包含大量数据的Web应用程序,以及包含多个字段的搜索/过滤器功能,例如名称,状态,日期等。我一直在使用这样的参数化查询来进行常规(非搜索)查询:
$id = $_POST['itemID'];
$db = mysqli_connect($host, $username, $password, $database);
$sql_query = "SELECT * FROM tbl_data WHERE ID = ?";
$stmt_query = mysqli_prepare($db, $sql_query);
mysqli_stmt_bind_params($stmt_query, "i", $id);
mysqli_stmt_execute($stmt_query);
//and so on..
如何使用多个可选参数再次保护SQL注入?最多可以设置10个单独的参数,可以设置也可以不设置。
编辑,因为问题似乎不清楚:
我的例子是一个参数,这不是可选的。我知道这可以防止sql注入。如何使用10个参数进行此操作,其中一个或多个参数可以同时设置?例如。像这样的查询:
SELECT * FROM tbl_data
WHERE NAME = ?
AND STATUS = ?
AND DATE = ?
AND PARAM4 = ?
AND PARAM5 = ?
用户只想搜索姓名和日期。我该怎么做绑定?检查100种可能的搜索词组合中的每一种都不是一个好主意。
答案 0 :(得分:3)
您已经受到sql注入的保护,因为您正在使用mysqli_stmt_bind_params,它将为您正确转义。
编辑。 您可以切换到某个数据库框架,以获得干净漂亮的代码。
否则......这是如此古老的意大利面风格......但我喜欢它:D
扩展代码以使用未知数量的参数非常容易。你应该循环你的参数,同时1.用问号符号构建你的查询字符串,并将你的参数添加到一个数组,你将传递给maxdb_stmt_bind_param(资源$ stmt,字符串$ types,array& ; $ var)。
所以它看起来像这样。它假设至少有一个参数(但避免这种情况很简单)。
$sql = "SELECT * FROM tbl_data WHERE ";
$and = '';
$types = '';
$parameters = array();
foreach($_POST as $k => $v) {
// check that $k is on your whitelist, if not, skip to the next item
$sql .= "$and $k = ?";
$and = " AND ";
$parameters[] = $v;
$types .= 's';
}
$stmt_query = mysqli_prepare($db, $sql);
mysqli_stmt_bind_params($stmt_query, $types, $parameters);
答案 1 :(得分:1)
我建议切换到PDO。它内置于PHP中,类似于mysqli扩展,但它具有更清晰的语法,允许您将参数值作为数组传递,您可以根据需要使用尽可能多的元素轻松地动态构建。