MySQL - SQL 注入
MySQL 中的 SQL 注入是一种有害的方法,攻击者会将有害的 SQL 代码插入或"注入"到数据库查询中。这可以通过用户输入(例如表单、URL 参数或 Cookie)来实现。攻击者利用软件中的漏洞窃取数据库中的信息。
SQL 注入的工作原理
假设您有一个带有登录页面的 Web 应用程序。当用户输入用户名和密码时,应用程序会根据 MySQL 数据库检查这些凭据。 SQL 查询可能如下所示 -
SELECT * FROM users WHERE username = 'user' AND password = 'password';
在安全的应用程序中,"user"和"password"将是用户实际输入的值。然而,在 SQL 注入攻击中,攻击者可以操纵输入字段来注入恶意 SQL 代码。
例如,他们可能输入以下内容作为用户名 -
' OR '1' = '1
现在,SQL 查询变为 -
SELECT * FROM users WHERE username = '' OR '1' = '1' AND password = 'password';
由于 '1' 始终等于 '1',因此该条件始终为真,攻击者获得对应用程序的未经授权的访问权限。通过这种方式,攻击者可以诱骗应用程序在未输入有效密码的情况下授予访问权限。
预防 SQL 注入
为了预防 SQL 注入,在使用 PERL 和 PHP 等脚本语言时,正确处理转义字符非常重要。在使用 PHP 和 MySQL 时,可以使用 mysql_real_escape_string() 函数来转义 MySQL 中具有特殊含义的输入字符。以下是一个示例 -
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } // 转义输入字符 $name = mysql_real_escape_string($name); // 使用转义后的"name"执行 MySQL 查询 mysqli_query("SELECT * FROM CUSTOMERS WHERE name='{$name}'");
LIKE 难题
现在,让我们解决 LIKE 子句的问题。处理用户提供的数据时,如果可能包含"%"和"_"字符,则需要创建自定义转义机制,将其视为文字。您可以通过结合使用"mysql_real_escape_string()"函数和"addcslashes()"函数来实现这一点,该函数允许您指定要转义的字符范围。以下是一个示例 -
// 对用户输入的字符串中的 '%' 和 '_' 进行转义和转换 $sub = addcslashes(mysql_real_escape_string("%str"), "%_"); // $sub 将等于 \%str\_ // 在 LIKE 查询中使用转义后的字符串 mysqli_query("SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
通过这种方式,您可以确保用户输入中的 '%' 和 '_' 字符在 SQL 查询中被视为文字字符,从而防止 SQL 注入并维护数据库操作的完整性。