大早上起来就收到周同学(他的博客:MikeTech)的微信说我的站内搜索存在漏洞,可以被注入式攻击,幸好他不知道我的数据库表名,不然能把我数据库给清空了,于是就赶紧来处理下这个问题。(P.S.:其实这个问题我早就知道了,只不过是当时没时间修,后来就忘了。)
什么是SQL注入,这是周同学对于我这个问题写的一篇博客,讲述了一些关于SQL注入的问题。这里我就简单的写一下我怎么修复的这个问题:
这是一段来自“MySQL 及 SQL 注入 | 菜鸟教程”的描述:
<?php
//代码片作者:Carl Zhang,转载请注明。
//获取搜索关键字
$keyword=trim($_POST["keyword"]);
//检查是否为空
if($keyword==""){
echo "<p style='text-align: center;'>您要搜索的关键字不能为空</p>";
//返回按钮帮助用户返回原界面进行修改。
echo "<div style='text-align: center;'>";
echo "<input type='submit' name='Back' onclick='history.back()' value='返回' />";
echo "</div>";
//结束程序
exit;
}
define ('HOSTNAME', '数据库主机名');
define ('USERNAME', '数据库用户名');
define ('PASSWORD', '数据库用户登录密码');
define ('DATABASE_NAME', '需要查询的数据库');
$link = mysql_connect(HOSTNAME, USERNAME, PASSWORD) or die('连接数据库失败,请稍后重试。');
//新添加的
$keyword=mysql_real_escape_string($keyword, $link);
$sql = "SELECT * FROM `表格名字` WHERE `summary` LIKE '%$keyword%' OR `title` LIKE '%$keyword%'";
$retval = mysql_query( $sql, $link );
if(! $retval )
{
die('未找到相关文章。');
}
mysql_select_db(DATABASE_NAME) or die('连接数据库失败,请稍后重试。');
?>
看上方代码片中,多了一行代码:“$keyword=mysql_real_escape_string($keyword, $link);”。这行代码的目的是用来转义特殊字符的,具体可以查看W3Cschool的文档:PHP mysql_real_escape_string() 函数。加了这一行代码以后,周同学博客中提出的这些注入式攻击都被化解了。当然,这行代码还是有漏洞的,如果黑客想要攻击还是可以绕开的。具体可看:PHP防SQL注入不要再用addslashes和mysql_real_escape_string了。
其实现在来说,PHP 5.5以上的版本都是不建议使用mysql的,而是用mysqli来代替,甚至都已经禁止使用mysql_query语句了。不过由于我这个就是一个简单的搜索功能,数据库里也没有太大的有价值/隐私之类的东西,也没有用户名密码需要存储,所以就不管他了。至于更多教程网站上提出的使用“magic_quotes_gpc”,这个在PHP 5.3的时候就已经废止了,在PHP 5.4的时候就彻底移除了,所以就不要再考虑用这个了,就算你用的是更老版本的PHP也建议关掉这个功能。
(本文为作者原创。转载请注明:转自carlzhang.xyz)