MySQL - SQL 注入
- SQL 注入的工作原理
- 防止 SQL 注入
MySQL 中的 SQL 注入是一种有害的技术,攻击者通过这种方式将恶意 SQL 代码插入或“注入”到数据库查询中。这可以通过用户输入(如表单、URL 参数或 cookies)来实现。攻击者利用软件的弱点从数据库中窃取信息。
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 注入并维护数据库操作的完整性。