Php 为什么Mysqli prepared语句不转义通配符(%and \)和反斜杠(\)?
作为一种安全措施,我使用Mysqli prepared语句和bindvariables 我的代码如下所示:Php 为什么Mysqli prepared语句不转义通配符(%and \)和反斜杠(\)?,php,mysql,mysqli,prepared-statement,sql-injection,Php,Mysql,Mysqli,Prepared Statement,Sql Injection,作为一种安全措施,我使用Mysqli prepared语句和bindvariables 我的代码如下所示: $what = trim($_GET['what']); $key_word = "%".$what."%"; $where_clause = " WHERE chair.company LIKE ? OR chair.business_category LIKE ? OR chair.summary LIKE ?"; $query = "SELECT chair.id_user, c
$what = trim($_GET['what']);
$key_word = "%".$what."%";
$where_clause = " WHERE chair.company LIKE ? OR chair.business_category LIKE ? OR chair.summary LIKE ?";
$query = "SELECT chair.id_user, chair.company FROM chair" . $where_clause;
$con = @mysqli_connect($hostname,$username,$password, $database_name);
$stmt = mysqli_prepare($con, $query);
$bind = mysqli_stmt_bind_param($stmt, 'sss', $key_word, $key_word, $key_word);
mysqli_stmt_execute($stmt);
mysqli_stmt_store_result($stmt);
$bind = mysqli_stmt_bind_result($stmt,$business_id,$company);
while (mysqli_stmt_fetch($stmt))
{
echo htmlspecialchars($company)."<br>";
}
发件人:
作为显式转义特殊字符的替代方法,许多MySQL API提供占位符功能,使您能够在语句字符串中插入特殊标记,然后在发出语句时将数据值绑定到它们。在本例中,API负责为您转义值中的特殊字符
我可以使用键盘中除\%\之外的所有字符,并正确转义和匹配。
我的问题是,这个准备好的语句不能转义通配符%和u和转义字符\。当我搜索%时,它列出数据库中的所有项目。当我搜索时,它会列出所有项目。
搜索\时,它与所需项目不匹配
我已经找到了一个,但是amswer从来没有满足我的要求,因为我必须在查询中使用通配符
答案是为了逃避他们,使用双反斜杠
即使这不是一个安全问题,为什么事先准备好的声明也不能逃避它们?
我在代码中使用它的方式有错误吗?
如何动态地避开它们?我可以使用哪一个函数?准备好的语句可以正确地转义\。否则,它们将无法创建格式正确的语句,而这正是预处理语句的主要目的
除此之外,%和u只是字符串的特殊字符,而不是一般的字符串。因此,一般来说,没有必要逃避它们。如果您需要将它们转义为类似的比较,请明确执行以下操作:
$what = addcslashes($what, '%_');
除此之外,还支持使用除\:
%:它们是同类声明的一部分;如果他们逃跑了,他们就不会工作。
mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|';
-> 1