转义 MySQL 通配符:综合指南
在 MySQL 环境中处理不可信的用户输入时,将特殊字符转义为至关重要防止SQL注入攻击。 PHP 函数 mysql_real_escape_string 通常用于此目的。但是,它不会转义 MySQL 通配符“%”和“_”。
为了解决这个问题,一些用户诉诸使用 addcslashes 来手动转义这些通配符。然而,这种方法可能会导致意外的结果,如提供的示例所示:
Input: test_test " ' Database: test\_test " '
这里,下划线(“_”)使用前面的反斜杠进行转义,与单引号(“'”)不同) 和双引号 (""")。这种行为可能会令人困惑,因为所有这些字符都是使用反斜杠字符转义的。
理解这种现象需要深入研究MySQL 的通配符转义机制在一般 MySQL 使用中不被视为通配符,并且在构造普通字符串文字时不应被转义。
但是,“%_”仅在 LIKE 匹配上下文中成为特殊字符 要准备在 LIKE 语句中使用的字符串,即使在使用参数化时也必须执行 LIKE 转义。
LIKE 转义涉及两个级别:
双反斜杠转义的可能性可能会出现问题,特别是如果您使用 PHP 的字符串文字,如示例中所示。
为了避免这些复杂性并确保可移植性,请考虑覆盖默认值(不正确)LIKE 转义行为并使用 LIKE ... ESCAPE ... 构造指定自定义转义字符:
// function that performs LIKE escaping function like($s, $e) { return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s); }
然后,按如下方式使用它:
$escapedname = mysql_real_escape_string(like($name, '=')); $query = "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";
通过遵循这些建议,您可以有效地避开 MySQL 通配符并增强数据库应用程序的安全性。
以上是如何转义 MySQL 通配符以实现安全 SQL 查询?的详细内容。更多信息请关注PHP中文网其他相关文章!