防范xss的正确姿势


xss攻击是web攻击中非常常见的一种攻击手段。如果你还没有听说过xss攻击,可以先了解xss的相关知识和原理,例如: XSS)" target="_blank" rel="nofollow,noindex">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攻击。虽然需要对每个输出数据都进行转义,但是如果你使用带自动转义的模版或者框架来处理的话,那么就可以极大的提高效率,又可以规避安全的问题。最后还是要提醒大家,安全无小事,即使你觉得没有人会攻击的系统,还是要规避这些风险,安全是系统的基石。

参考文献:

Why escape-on-input is a bad idea

When do you escape your data?

This article used CC-BY-SA-3.0 license, please follow it.

时间: 2024-10-15 21:30:32

防范xss的正确姿势的相关文章

程序员取悦女朋友的正确姿势---Tips(iOS美容篇)

前言 女孩子都喜欢用美图工具进行图片美容,近来无事时,特意为某人写了个自定义图片滤镜生成器,安装到手机即可完成自定义滤镜渲染照片.app独一无二,虽简亦繁. JH定律:魔镜:最漂亮的女人是你老婆魔镜:程序员不是木头人 核心技术 图片滤镜核心技术的基本思路如下: 核心技术流程 具体流程 1.创建一个图像处理工具类 注:该类实例包括一个图像处理方法,该方法在传入原始图像和一个颜色矩阵后生成一个处理好的图像. @interface JHFeilterManager : NSObject @proper

docker centos rpm离线安装1.8.2及pull的正确姿势

1.离线安装 本次只针对1.8.2版本,所需要的rpm包如下 docker-engine-1.8.2-1.el7.centos.x86_64.rpm(已上传51cto) libcgroup-0.41-8.el7.x86_64.rpm libcgroup-devel-0.41-8.el7.x86_64.rpm libcgroup-pam-0.41-8.el7.x86_64.rpm libcgroup-tools-0.41-8.el7.x86_64.rpm(libcgroup请参考开源镜像库) 简单

观看学习视频的正确姿势与姿态

开学至今,时时被二柱子逼得走投无路. 痛定思过,目前的自己确实是"三拍",一拍觉得这样那样一定可以胸有成竹,二拍有了点子拿起手术刀就开始实践,三拍无法实现代码拍屁股放弃.啊,我为了二柱子建了好多好多包,想过好多好多条"去北京的路",结果...还是死于基础太烂.也不愿意头悬梁锥刺股.所以呢,那就改进学习方式呗,提高效率. 整个开发过程中,自己犯了一个很大的错误.即是在第五周中途才突然发现,其实代码在整个学习过程中虽说是基础但不是没有它就建不成大楼.而我,白白的把4周的

Node.js中使用redis数据库的正确姿势

Redis是一个常用的Nosql数据库,一般用来代替Memcached做缓存服务,同时它也支持数据的持久化,有着比较广泛的应用场景.在Java中使用redis我们已经比较熟悉了,那么在node.js和koa.js框架中使用Redis的正确姿势是怎样的呢? Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: * Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载

重磅消息!河南省考正确姿势:安心过双节!(推迟后18届毕业生有福!)

重磅消息!河南省考正确姿势:安心过双节!(推迟后18届毕业生有福!) 小可爱们,说想我了没? 肯定想了是吧哈哈 自恋一分钟! 河南省考推迟消息已确定 正确姿势:安心过双节! 各位小伙伴可以愉快的过双节啦! 开心吧! 不信请看:这次小编不骗你啦! 证据

在Linux(ubuntu server)上面安装NodeJS的正确姿势

上一篇文章,我介绍了 在Windows中安装NodeJS的正确姿势,这一篇,我们继续来看一下在Linux上面安装和配置NodeJS. 为了保持一致,这里也列举三个方法 第一个方法:通过官网下载安装 https://nodejs.org/en/download/ 这种方式的问题是我们需要自己去找网页,找到链接,然后下载 第二个方法:使用apt工具进行安装 默认情况下,在apt的源中只有比较老的版本(注意,需要先apt-get update) 例如,如果运行apt-get install nodej

ios监听ScrollView/TableView滚动的正确姿势

主要介绍 监测tableView垂直滚动的舒畅姿势 监测scrollView/collectionView横向滚动的正确姿势 1.监测tableView垂直滚动的舒畅姿势 通常我们用KVO或者在scrollViewDidScroll代理方法中监听ScrollView/TableView的contentOffset,比如监听TableView的contentOffset来设置导航栏的透明度或者拉伸顶部的图片. image image 常见的姿势是在scrollViewDidScroll的代理方法中

使用layoutinflater的正确姿势

使用layoutinflater的正确姿势 一开始接触安卓开发的时候,知道layoutinflater是用来将布局文件生成对应的View.那时候还是懵懵懂懂知道需要传递一个layoutId一个parent参数和一个false参数.那时候就这样用,初初还是好好的.直到后来随着进一步学习安卓开发发现layoutinflater的这两个参数是有大大的门道在里面. 然后这一篇博客可以说是我对layoutinflater使用的一个总结. 怎么添加一个View到ViewGroup? 在讨论怎么使用layou

判断是否为gif/png图片的正确姿势

判断是否为gif/png图片的正确姿势 1.在能取到图片后缀的前提下 1 2 3 4 5 6 7 8 9 //假设这是一个网络获取的URL NSString *path = @"http://pic3.nipic.com/20090709/2893198_075124038_2.gif"; // 判断是否为gif NSString *extensionName = path.pathExtension; if ([extensionName.lowercaseString isEqua