Mysql 简明教程

MySQL - SQL Injection

MySQL 中的 SQL 注入是一种有害的方法,攻击者在其中将有害的 SQL 代码插入或“注入”到数据库查询中。这可以通过用户输入(例如表单、URL 参数或 Cookie)完成。攻击者利用软件的弱点从数据库中窃取信息。

How SQL Injection Works

想象一下,您有一个带有登录页面的 Web 应用程序。当用户输入他们的用户名和密码时,应用程序会根据 MySQL 数据库检查这些凭据。SQL 查询可能如下所示 −

SELECT * FROM users
WHERE username = 'user' AND password = 'password';

在一个安全的应用程序中,“用户”和“密码”将是用户输入的实际值。然而,在 SQL 注入攻击中,攻击者可以操纵输入字段来注入恶意 SQL 代码。

例如,他们可能会输入以下内容作为用户名 −

' OR '1' = '1

现在,SQL 查询变为 −

SELECT * FROM users
WHERE username = '' OR '1' = '1' AND password = 'password';

由于“1”总是等于“1”,因此此条件始终为真,攻击者可以未经授权访问应用程序。通过这种方式,他们诱骗应用程序在没有有效密码的情况下授予访问权限。

Preventing SQL Injection

为了防止 SQL 注入,在使用 PERL 和 PHP 等脚本语言时,正确处理转义字符非常重要。在使用 PHP 和 MySQL 时,可以使用 mysql_real_escape_string() 函数转义在 MySQL 中具有特殊含义的输入字符。以下是如何执行此操作的示例 −

if (get_magic_quotes_gpc()) {
   $name = stripslashes($name);
}
// escape input characters
$name = mysql_real_escape_string($name);

// Perform the MySQL query with the escaped 'name'
mysqli_query("SELECT * FROM CUSTOMERS WHERE name='{$name}'");

The LIKE Quandary

现在,让我们解决 LIKE 子句的问题。在处理可能包含“%”和“_”字符的用户提供的数据时,创建一个自定义转义机制非常重要,以便将它们视为字面意思。您可以通过将“mysql_real_escape_string()”函数与“addcslashes()”函数结合使用来实现此目的,后者允许您指定要转义的字符范围。以下是执行此操作的方法示例 −

// Escape and convert '%' and '_' in the user-provided string
$sub = addcslashes(mysql_real_escape_string("%str"), "%_");

// $sub will be equal to \%str\_

// Use the escaped string in the LIKE query
mysqli_query("SELECT * FROM messages
   WHERE subject LIKE '{$sub}%'");

通过这种方式,您可以确保用户输入中的“%”和“_”字符在 SQL 查询中被视为字面字符,从而防止 SQL 注入并维护数据库操作的完整性。