防范xss的正确姿势
防范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.
防范xss的正确姿势的更多相关文章
- 判断是否为gif/png图片的正确姿势
判断是否为gif/png图片的正确姿势 1.在能取到图片后缀的前提下 1 2 3 4 5 6 7 8 9 //假设这是一个网络获取的URL NSString *path = @"http:/ ...
- 在Linux(ubuntu server)上面安装NodeJS的正确姿势
上一篇文章,我介绍了 在Windows中安装NodeJS的正确姿势,这一篇,我们继续来看一下在Linux上面安装和配置NodeJS. 为了保持一致,这里也列举三个方法 第一个方法:通过官网下载安装 h ...
- 程序员取悦女朋友的正确姿势---Tips(iOS美容篇)
前言 女孩子都喜欢用美图工具进行图片美容,近来无事时,特意为某人写了个自定义图片滤镜生成器,安装到手机即可完成自定义滤镜渲染照片.app独一无二,虽简亦繁. JH定律:魔镜:最漂亮的女人是你老婆魔镜: ...
- ios监听ScrollView/TableView滚动的正确姿势
主要介绍 监测tableView垂直滚动的舒畅姿势 监测scrollView/collectionView横向滚动的正确姿势 1.监测tableView垂直滚动的舒畅姿势 通常我们用KVO或者在scr ...
- 防范XSS
.net framework4.5 提供了AntiXss类,来防范XSS攻击. 在开放指令的同时过滤危险字符串,使用AntiXss.GetSafeHtmlFragment(html)方法,具体可以参照 ...
- 玩转 Ceph 的正确姿势
玩转 Ceph 的正确姿势 本文先介绍 Ceph, 然后会聊到一些正确使用 Ceph 的姿势:在集群规模小的时候,Ceph 怎么玩都没问题:但集群大了(到PB级别),这些准则可是保证集群健康运行的不二 ...
- 解锁redis锁的正确姿势
解锁redis锁的正确姿势 redis是php的好朋友,在php写业务过程中,有时候会使用到锁的概念,同时只能有一个人可以操作某个行为.这个时候我们就要用到锁.锁的方式有好几种,php不能在内存中用锁 ...
- jquery选中radio或checkbox的正确姿势
jquery选中radio或checkbox的正确姿势 Intro 前几天突然遇到一个问题,没有任何征兆的..,jquery 选中radio button单选框时,一直没有办法选中,后来查了许多资料, ...
- 程序员节应该写博客之.NET下使用HTTP请求的正确姿势
程序员节应该写博客之.NET下使用HTTP请求的正确姿势 一.前言 去年9月份的时候我看到过外国朋友关于.NET Framework下HttpClient缺陷的分析后对HttpClient有了一定的了 ...
随机推荐
- 红黑树 Java实现
概要 前面分别介绍红黑树的理论知识.红黑树的C语言和C++的实现.本章介绍红黑树的Java实现,若读者对红黑树的理论知识不熟悉,建立先学习红黑树的理论知识,再来学习本章.还是那句老话,红黑树的C/C+ ...
- 记一次java程序out of memory问题
在一个比较大批量的pdf转String项目中遇到了:java.lang.OutOfMemoryError: Java heap space错误 第一反应肯定是程序没有写好,大量循环时没有把程序中没有用 ...
- Corosync+Pacemaker+crmsh构建Web高可用集群
一.概述: 1.1 AIS和OpenAIS简介 AIS应用接口规范,是用来定义应用程序接口(API)的开放性规范的集合,这些应用程序作为中间件为应用服务提供一种开放.高移植性的程序接口.是在实现高可用 ...
- 【bzoj3751】 Hnoi2014—画框
http://www.lydsy.com/JudgeOnline/problem.php?id=3571 (题目链接) 题意 给出一个$2*N$个点的二分图,$N*N$条边,连接$i$和$j$的边有两 ...
- UVA.12716 GCD XOR (暴力枚举 数论GCD)
UVA.12716 GCD XOR (暴力枚举 数论GCD) 题意分析 题意比较简单,求[1,n]范围内的整数队a,b(a<=b)的个数,使得 gcd(a,b) = a XOR b. 前置技能 ...
- Mac显示同一程序的所有窗口
通过F3键可以显示所有程序的所有窗口到桌面,但是如果窗口太多的话显示出来很难看清. 如果只显示某一个程序的所有窗口就不会乱了. 其实在dock上有一个相应的选项,但是没有快捷键. 开启方法: 在终端上 ...
- Python之旅:并发编程之IO模型
一 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非 ...
- Harris角点及Shi-Tomasi角点检测(转)
一.角点定义 有定义角点的几段话: 1.角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测.图像匹配.视频跟踪.三维建模和目标识别等领域中.也 ...
- 前缀、中缀、后缀表达式以及简单计算器的C++实现
前缀表达式(波兰表达式).中缀表达式.后缀表达式(逆波兰表达式) 介绍 三种表达式都是四则运算的表达方式,用以四则运算表达式求值,即数学表达式的求解. 前缀表达式 前缀表达式是一种没有括号的算术表达式 ...
- 《编程快速上手》--web抓取--利用webbrowser模块的mapIT.py
1.代码如下 #! python3 # mapIT.py - Launches a map in the browser using an address from the # command lin ...