gpt4 book ai didi

php - 为什么Mysqli准备好的语句不转义通配符(%和_)和反斜杠(\)?

转载 作者:行者123 更新时间:2023-11-29 13:11:04 26 4
gpt4 key购买 nike

作为一项安全措施,我使用 Mysqli 准备好的语句和绑定(bind)变量。

我的代码如下所示:

$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>";
}

来自Documentation :

As an alternative to explicitly escaping special characters, many MySQL APIs provide a placeholder capability that enables you to insert special markers into a statement string, and then bind data values to them when you issue the statement. In this case, the API takes care of escaping special characters in the values for you.

我可以使用键盘中的所有字符(不包括\% _ )并正确转义和匹配。我的问题是这个准备好的语句没有转义通配符(%和_)和转义字符(\)。当我搜索 % 时,它列出了数据库中的所有项目。当我搜索 _ 时,它会列出所有项目。当搜索 (\) 时,它与所需的项目不匹配。

我找到了一个similar Question ,但是 amswer 永远无法满足我的要求,因为我必须在查询中使用通配符。

Another Question答案说要转义它们,请使用双反斜杠

即使这不是安全问题,为什么准备好的语句不能逃脱它们?我在代码中使用它的方式有什么错误吗?如何动态地逃避它们?我可以使用哪个功能?

最佳答案

准备好的语句确实正确转义了\。否则他们将无法创建格式正确的 string literals ,这是准备好的语句的主要目的。

除此之外,%_ 只是 LIKE comparison 的特殊字符。但不适用于一般字符串。所以一般来说没有必要逃避它们。如果您需要转义它们以进行 LIKE 比较,请明确执行:

$what = addcslashes($what, '%_');

除此之外,LIKE还支持使用 \ 以外的转义字符:

mysql> SELECT 'David_' LIKE 'David|_' ESCAPE '|';
-> 1

关于php - 为什么Mysqli准备好的语句不转义通配符(%和_)和反斜杠(\)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22088897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com