从现有经验浅谈PHP程序下的XSS SQL注入 攻防

作者: SillyLi 分类: Other 发布时间: 2018-09-13 18:49
本文共1963字没有图片,预计阅读时间需要6分钟。

在表白墙程序发布以后 在被很多网友使用之后就显现出了我对网络攻击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中有

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注