65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.80/5 (4投票s)

2009年10月19日

CPOL

2分钟阅读

viewsIcon

36396

一篇关于如何移除SQL注入的简短指南,包含可重用的代码

引言

在使用MySQL等技术时,开发者应该努力正确地清理输入,因为这些系统很容易受到攻击。本指南并不全面,并且预计读者需要具备PHP和MySQL的先验知识。

背景

数据库将信息存储在表中。反过来,查询用于根据给定的条件获取、更新和插入表中的信息。查询由关键字(INSERTUPDATESELECT)、表名和其他值(例如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日:初始发布
© . All rights reserved.