移除 PHP 和 MySQL 架构中的 SQL 注入。






2.80/5 (4投票s)
一篇关于如何移除SQL注入的简短指南,包含可重用的代码
引言
在使用MySQL等技术时,开发者应该努力正确地清理输入,因为这些系统很容易受到攻击。本指南并不全面,并且预计读者需要具备PHP和MySQL的先验知识。
背景
数据库将信息存储在表中。反过来,查询用于根据给定的条件获取、更新和插入表中的信息。查询由关键字(INSERT
、UPDATE
、SELECT
)、表名和其他值(例如PHP变量)组成。所有这些值共同构建一个字符串(称为SQL语句),然后使用诸如mysqli_query()
之类的函数执行该字符串。问题在于,当希望使用来自表单的原始用户输入(例如用户名或密码)时,输入可能包含SQL语句。反过来,这些语句可以执行,导致意外的结果,例如未经授权的表删除或未经授权的额外记录插入。
可以采取哪些措施来阻止此问题?MySQL注入是一种古老且被认可的漏洞。创建了函数来正确清理用户输入,从而消除了SQL注入成功的可能性。特别是,应该使用函数mysql_real_escape_string()
,如果magic_quotes_gpc
开启,则与stripslashes()
一起使用。
使用这些函数非常简单。第一个函数为一些特殊字符添加反斜杠(如果它们存在于用户输入中),以转义它们。此函数有两个参数:第一个是从用户处获取的未转义字符串(通常来自表单字段),第二个是可选的链接标识符。链接标识符可能不是可选的,具体取决于解决方案。当使用mysql_connect
时,结果字符串用作mysql_real_escape_string()
函数中的第二个参数。顺便说一下,如果您使用mysqli_connect
连接到数据库,则可能需要使用mysql_connect
代替。
第二个函数stripslashes()
用于删除带引号字符串中的引号。该函数有一个参数,即要清理的字符串。只有在magic_quotes_gpc
开启时才需要此函数。可以使用phpinfo()
函数找到它。
整合
最后,我们可以构建一个函数来从原始字符串中移除SQL注入,如下所示。显然,您的连接字符串将与您的数据库/服务器不同。
function Remove_SQLi($str)
{
$connection_string = mysql_connect('server', 'database_user','user_password');
if(get_magic_quotes_gpc())
{
return mysql_real_escape_string(stripslashes($str), $connection_string);
}
else
return mysql_real_escape_string($str, $connection_string);
}
这应该可以阻止大多数攻击,但仍然可能容易受到盲SQL注入的影响!如果您对其他漏洞感兴趣,请尝试查找XSS(跨站脚本)。
相关阅读
这篇文章摘自我的个人网站,更多文章和我的博客可以在那里找到。
历史
- 2009年10月19日:初始发布