MySQL - SQL 注入



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

SQL 注入是如何工作的

假设您有一个带有登录页面的 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”,所以此条件始终为真,攻击者可以未经授权访问应用程序。通过这种方式,他们诱使应用程序在没有有效密码的情况下授予访问权限。

防止 SQL 注入

为了防止 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}'");

LIKE 子句的难题

现在,让我们解决 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 注入并维护数据库操作的完整性。

广告