首页 >后端开发 >php教程 >如何转义 MySQL 通配符以实现安全 SQL 查询?

如何转义 MySQL 通配符以实现安全 SQL 查询?

Barbara Streisand
Barbara Streisand原创
2024-11-09 10:03:02240浏览

How to Escape MySQL Wildcards for Secure SQL Queries?

转义 MySQL 通配符:综合指南

在 MySQL 环境中处理不可信的用户输入时,将特殊字符转义为至关重要防止SQL注入攻击。 PHP 函数 mysql_real_escape_string 通常用于此目的。但是,它不会转义 MySQL 通配符“%”和“_”。

为了解决这个问题,一些用户诉诸使用 addcslashes 来手动转义这些通配符。然而,这种方法可能会导致意外的结果,如提供的示例所示:

Input: test_test " '
Database: test\_test " '

这里,下划线(“_”)使用前面的反斜杠进行转义,与单引号(“'”)不同) 和双引号 (""")。这种行为可能会令人困惑,因为所有这些字符都是使用反斜杠字符转义的。

理解这种现象需要深入研究MySQL 的通配符转义机制在一般 MySQL 使用中不被视为通配符,并且在构造普通字符串文字时不应被转义。

但是,“%_”仅在 LIKE 匹配上下文中成为特殊字符 要准备在 LIKE 语句中使用的字符串,即使在使用参数化时也必须执行 LIKE 转义。

LIKE 转义涉及两个级别:

  1. LIKE 转义: _ 和 % 是特殊的,必须转义,转义字符 () 也必须是转义的。转义。
  2. 字符串文字转义:之后与转义一样,使用 mysql_real_escape_string(对于 MySQL)或其他数据库的适当函数执行纯字符串转义。

双反斜杠转义的可能性可能会出现问题,特别是如果您使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn