我有一个包含大量数据的 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 种可能的搜索词组合并不是一个好主意。
您已经受到了针对 sql 注入的保护,因为您正在使用 mysqli_stmt_bind_params ,它将为您正确转义。
编辑。
您可以切换到某些数据库框架以获得干净漂亮的代码。
否则...这是很旧的意大利面条风格...但我喜欢它:D
扩展代码以使用未知数量的参数非常容易。您应该只循环参数,同时 1. 使用问号符号构建查询字符串,并将参数添加到数组中,该数组将传递给 maxdb_stmt_bind_param (资源 $stmt 、 string $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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)