有效预防xss_防范xss的正确姿势

xss攻击是web攻击中非常常见的一种攻击手段。如果你还没有听说过xss攻击,可以先了解xss的相关知识和原理,例如:https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)。

防范xss攻击的方式也十分简单:转义!

但是转义的时机?是在持久化之前转义呢,还是读数据之后escape呢?

我开始想也没想就选择了第一种方式,因为这种方法看上去一劳永逸,但是我现在越来越倾向于第二种方式。

实际上选择第一种还是第二种需要根据你的实际情况来定。我们知道xss攻击是一种web攻击手段,它的运行环境是在用户的浏览器中,也就是说用户的运行环境是不可控的。那么在持久化之前进行转义看上去似乎不错,因为我们可以利用filter或者interceptor拦截所有的写入请求,统一进行转义。这样一来,我们的业务逻辑就完全不需要care转义的问题了,因为我们取到的数据已经都是转义的过的了。

如果用户的终端是可控的,比如:Native App,那么入库之前进行转义就显得多此一举,因为所有的输出方式都是在我们的App中展现的,自然也就不会出现了xss攻击的问题了。例如用户在评论中输入了,你觉得用户希望输出;,还是呢? 结果是显而易见的。

现实的情况往往是复杂的,不会只有黑和白、0与1、native和web,更多的是它们交织在一起,互相入侵对方的领域。基本上现在大部分的App都有分享功能,那么恶意的用户完全可以在评论中插入注入代码,再将该评论分享出去,那么其它被分享的用户就有被攻击的风险。解决的方法就是针对分享的数据进行全局转义,事实上已经很多模版系统已经帮我们考虑了这部分问题,例如Django和Jinja2的模版就是默认开启自动转义的。如果是前后端分离的场景,也可以有前端来进行escape。

我推荐使用“入库不转义读转义”还有一个原因,那就是前期转义格式的不确定性和后期输出的多样性。如果你正在正在开发一个rest服务器,你与App使用json格式通信。为了简单,在开始业务代码前,你对所有输入数据按照html格式进行转义。那么你可以十分放心分享出去的数据是安全的,因为所有的数据在持久化之前就已经转义了,同时你会痛苦unescape给App的数据。如果那天老板要求你以xml的格式输出这些数据(可能是其它系统的输入要求,也可能是打印报表),那么你会更加痛苦。因为xml和html的转义字符还是有些不同的,你不得不先unescape回原始数据然后再按照xml的格式escape一次。如果这样你觉得都还ok,那么我开始有点佩服你了。如果老板还要求你有更多的输出格式,那么你会更加痛苦,这还是在没有考虑输入格式变化的情况下。因为一个转义的问题导致逻辑变得复杂,影响系统的稳定性是得不偿失的。

最后,我总结一下这两种方式的优缺点:

转义方式 优点 缺点 入库前转义 一劳永逸 需要针对多端进行不同的输出,灵活性不足,无法应对后期数据格式的变化

读取前转义 简单,灵活,能应对各种数据格式的场景 需要对每个输出数据转义,人工处理容易遗漏

本人推荐第二种方式来防范xss攻击。虽然需要对每个输出数据都进行转义,但是如果你使用带自动转义的模版或者框架来处理的话,那么就可以极大的提高效率,又可以规避安全的问题。最后还是要提醒大家,安全无小事,即使你觉得没有人会攻击的系统,还是要规避这些风险,安全是系统的基石。

参考文献:

一、什么是XSS攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。 二、XSS漏洞的危害 (1)网络钓鱼,包括盗取各类用户账号; (2)窃取用户cookies资料,从而获取用户隐私信息,或利用用户身份进一步对网站执行操作; (3)劫持用户(浏览器)会话,从而执行任意操作,例如进行非法转账、强制发表日志、发送电子邮件等; (4)强制弹出广告页面、刷流量等; (5)网页挂马; (6)进行恶意操作,例如任意篡改页面信息、删除文章等; (7)进行大量的客户端攻击,如DDoS攻击; (8)获取客户端信息,例如用户的浏览历史、真实IP、开放端口等; (9)控制受害者机器向其他网站发起攻击; (10)结合其他漏洞,如CSRF漏洞,实施进一步作恶; (11)提升用户权限,包括进一步渗透网站; (12)传播跨站脚本蠕虫等; 三、过滤器配置 web.xml配置 XssFilter com.xxx.Filter.XssFilter XssFilter /*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值