SQL 的代码注入攻击

服务器的 SQL 数据区查询字符串如果不仔细写,就很容易导致 SQL 注入攻击。例如

$query = "SELECT * FROM users WHERE (name = '" + $username + "') and (password = '"+ $password +"');"

如果恶意用户提交下面的字符串作为用户名和密码:

$username = "' OR '1'='1";
$password = "' OR '1'='1";

将会导致 SQL 查询语句变成:

$query = "SELECT * FROM users WHERE (name = '' OR '1'='1') and (password = '' OR '1'='1');"

这个查询语句等价于

$query = "SELECT * FROM users;"

将会导致无需帐号密码即可登录网站。

这个问题的解决方法是,或者转义字符串的特殊字符,或者用参数化查询。利用 PHP 的 mysql_real_escape_string 函数可以将字符串的特殊字符转义。例如:

$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
$query = "SELECT * FROM users WHERE (name = '" + $username + "') and (password = '"+ $password +"');"

PHP 中参数化查询的用法可以参考这篇文章

参考资料:
[1] SQL - 维基百科,自由的百科全书
[2] SQL注入攻击 - 维基百科,自由的百科全书
[3] 参数化查询 - 维基百科,自由的百科全书
[4] 检查 Sql 查询中是否有安全漏洞 - MSDN
[5] 程序员疫苗:代码注入 | 酷壳 - CoolShell.cn
[6] 水木社区:同主题-安全技术-雨滴1
[7] PHP: mysql_real_escape_string - Manual

原文地址:https://www.cnblogs.com/zoho/p/2909055.html