从现有经验浅谈PHP程序下的XSS SQL注入 攻防
在表白墙程序发布以后 在被很多网友使用之后就显现出了我对网络攻击XSS SQL注入方面的经验不足
因为之前在给晨风QQ机器人做接口的时候,有被SQL注入的经历,所以在表白墙程序发布时对表白墙程序做了防SQL注入,但是这次的表白墙程序与API接口不同的是 API接口纯后端 根本不存在XSS注入的可能性 这次在表白墙程序发布不久后就遇到了网友反应被XSS注入的问题
先简单谈之前被SQL注入的经历
之前再给晨风QQ机器人做接口时 接口使用卡密授权
授权仅使用了的SQL语句判断卡密是否存在 下面实例
$km = $_GET['km'];
$sql = "SELECT * FROM `sillyli_km` WHERE `km` = '".$km."'";
此时如果接入的GET参数km内容为 1′ or 1=’1 那么SQL语句直接变为
$sql = SELECT * FROM `sillyli_km` WHERE `km` = '1' or 1 = '1';
此时SQL语句被添加了一个条件 or 1 = ‘1’ 也就是 “或者1 = 1”的话也是返回True那么结果就不用看了 肯定是返回True也就是卡密存在
所以SQL返回结果无论如何都是这个卡密存在 此时注入成功 就可以成功获得你的授权
同理SQL语句如果查询密码等在接受参数未被设置检测的情况下 用此方法注入也是同意结果 也同理$km = $_GET[‘km’]; 直接将参数写入变量是非常危险的
下面是SQL注入的防御
对于上面所讲PHP里有专门防御SQL的内建函数:addslashes()
该函数主要作用就是在内容中的 ’ ” 等字符前面加\使PHP在执行时认为其是纯文本
而默认情况下PHP对于接受到的GET POST COOKIE等参数都会做addslashes处理
但是在实际环境中可以看出 对于VPS独立主机等自建BT宝塔 kangle AMH 面板等都会对接受参数进行过滤 但是大部分虚拟主机提供商 都没有对接受参数进行addslashes处理
然而在实际环境下所写程序被用户使用时有可能在任何环境下使用 如果在所写程序里面对所有接受参数都进行addslashes处理的话 在遇到PHP默认对接受参数已经处理过的情况下就会再次处理,这样会导致双层转义
所以在实际环境中PHP中运用自建函数进行对PHP是否已经对接受的参数进行了addslashes处理:
function daddslashes($string, $force = 0, $strip = FALSE) {
!defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc());
if(!MAGIC_QUOTES_GPC || $force) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force, $strip);
}
} else {
$string = addslashes($strip ? stripslashes($string) : $string);
}
}
return $string;
}
以上参数是SillyLi目前程序所用的SQL过滤函数
函数会对接收参数是否已进行addslashes进行检测并且检测结果会写入常量(性能优化) 如果程序的运行环境没有默认addslashes则执行一次addslashes 如果默认执行则不执行
这样在接受参数的时候可以写为
$msg = daddslashes($_GET['msg']);
做过处理后接受的信息就具备了SQL防御能力 且不影响高并发是的性能或者是影响最小的办法
XSS注入的攻防
在我博客下本人所写的表白墙墙源码再被网友使用后,反馈给我了被XSS注入的问题,因为之前主要在做后端接口,所以这表白墙源码对SQL注入设有防御,但是由于之前没有做前端的经验导致了XSS注入的问题
简单的说就是,表白墙在对输入的表白内容没有任何检测和处理的情况下,直接将内容保存到数据库,显示的时候也是直接输出,那么当有人把表白内容写为一段js代码等 的时候,前段浏览器就会执行这段代码,导致你的网页出现问题或者跳转到别的站点
示例:
<script>alert('Hello Word!');</script>
以表白墙为例 当以上内容被当做表白内容写入数据库时,输出的时候也会同样输出,这样网页就多了一段HTML代码 浏览器一单执行就弹出弹窗“Hello Word!”
<script>window.location.href='http://baidu.com'</script>
当被注入以上JS之后就会跳转到别的站点,当然更复杂的注入还可以获取其他用户cookie等等,如果被注入之后风险也是很大的,这里对注入不细将
针对XSS注入的防御
在PHP中有