文档章节

从程序员角度谈谈xss攻击的防御

h
 hxlhxl0937
发布于 2016/10/04 12:06
字数 825
阅读 50
收藏 0

#xss攻击的简介

xss即跨站脚本攻击(Cross Site Scripting),本质是html注入,核心原因是代码与数据没有做好隔离。举个例子来说:

一个jsp页面:

<span>  <%=username%>发表了评论   </span>

如果username值为<script>alert('xss')</script>,就会发现页面发生了注入攻击。本来预料的 用户X发表了评论字符没有出现,反而弹出了警告框。

个人感觉xss攻击,可以理解为html注入,是属于注入攻击的一种,出现在两种执行语法的交界处。换句话说,就是一个字符串在一种语言是一种标准的字符串,但是到了另外一种语言执行,就变成代码的一部分了。也就是代码和数据没有隔离好。

按照上面的例子可以这样理解,<script>alert('xss')</script>字符串在jsp中就是一个字符串,但是到了html页面解析执行时,这个字符串已经变成html的一个语法结构,已经不是一串单纯的字符串了。

注意一下,所有两种执行语法交界处都可能发生注入攻击。但是事实上我们常听到的注入攻击只有两种,html注入和sql注入。为什么前端数据转为http请求,以及http请求转为后台语言数据时都没有注入攻击的说法呢?因为浏览器对数据做了过滤,防止了注入攻击,对开发者和用户都是透明的。

防御注入攻击的方式只有一种就是字符过滤,但是因为不同语法的解析规则都不一样,所以不存在通用的注入防御规则,因为针对一种语法的防御到另外一种语法中就不适用了。

#防御xss攻击的方式

防御xss攻击的方式就是字符过滤,过滤的时机有两个:输入过滤和输出过滤。

输入过滤有一个比较麻烦的问题。当用户输入敏感字符时,输入过滤后,可能导致用户输入的字符串变成另外的字符串。举个例子来说:

一个用户的用户名为 hell"o ,输入过滤时,是要将 " 过滤为 " ,那么上个例子中的输出就会变为 hell"o发表了评论 ,用户名无欲无故多了,如果”过滤为 " ,那么js变量中用户名却变成 hell "o,这个也会很奇怪。

所以通常防御xss攻击时采用输出过滤的方式,在需要的地方进行过滤。

输入过滤一般只是使用在富文本中。

#输出过滤

本节主要是介绍所有html注入的地方,以及每种位置需要进行的过滤规则。最后简单介绍每种过滤规则的实现原理。

##html标签中输出

<div><%=var %></div>

需要进行htmlEncode。即将var变量中的 <>/'"&空格 全部转化成html特殊字符。

##html标签属性中输出

<div id="" name="<%=var %>" ></div>

进行htmlEncode。 ##script标签中输出

<script>var x="<%=var %>";</script>

使用JavascriptEncode。

##在事件中输出

<a href=# onclick="funcA('<%=var %>')" > test</a>

处理方式和<script>中类似,使用JavascriptEncode

##css中输出

<div style="background:url(javascript:alert('xss'))"></div>

尽量少在css中输出,如果必须使用OWASP ESAPI的encodeForCss函数。 ###在地址中输出

<a href="http://www.test.com?test=<%=var %>" />

使用URLEncode。可以防止一下情况的出现:

<a href="http://www.test.com?test=" onclick=alert(1) " />

对于<a href="<%=var %>" /> 需要做两种处理。 判断是否采用http协议开头,否就强制加上。 然后采用URLEncode。

##过滤规则说明 以上提到的过滤规则都是出自OWASP ESAPI这个项目,参考https://www.owasp.org/index.php/OWASP_Java_Encoder_Project#tab=Use_the_Java_Encoder_Project,感兴趣的可以自行百度谷歌一下,这里不展开了。

#总结

以上还没提到如何进行富文本的过滤,因为参考的是owasp的antiSamy项目,也是一个很大的项目,抽空就这内容单独介绍一下。

参考的资料:《白帽子讲web安全》

© 著作权归作者所有

h
粉丝 4
博文 6
码字总数 5802
作品 0
广州
私信 提问
加载中

评论(0)

Web-安全-学习资料(很全)​

看原文 看原文 看原文 Web-安全-学习资料(很全) Web-Security-Learning 在学习web安全的过程中整合的一些资料。 该repo会不断更新,最近更新日期为:2017/9/19。 9月19日更新: 新收录文章...

Ho0oH
2017/09/26
0
0
JSONP跨域资源共享的安全问题

目录 关于 JSONP 一、JSON 劫持 二、Callback 可定义导致的安全问题 三、其他文件格式( Content-Type )与 JSON 四、防御 摘自:http://blog.knownsec.com/2015/03/jsonpsecuritytechnic/ ...

osc_vwv0jnr8
2019/02/14
2
0
网络与安全

面试 -- 网络 HTTP 现在面试门槛越来越高,很多开发者对于网络知识这块了解的不是很多,遇到这些面试题会手足无措。本篇文章知识主要集中在 HTTP 这块。文中知识来自 《图解 HTTP》与维基百科...

掘金官方
2018/01/11
0
0
XSS,CSRF,Cookie防劫持的处理

Cookie与session HTTP天然是无状态的协议, 为了维持和跟踪用户的状态, 引入了Cookie和Session. Cookie包含了浏览器客户端的用户凭证, 相对较小. Session则维护在服务器, 用于维护相对较大的用...

osc_ll50uphu
2019/02/01
0
0
JSONP 安全攻防技术(JSON劫持、 XSS漏洞)

关于 JSONP JSONP 全称是 JSON with Padding ,是基于 JSON 格式的为解决跨域请求资源而产生的解决方案。他实现的基本原理是利用了 HTML 里 <script></script> 元素标签,远程调用 JSON 文件...

osc_lbsmihm9
2018/02/27
2
0

没有更多内容

加载失败,请刷新页面

加载更多

直接显示StackOverflow的答题日期, 增加评论区回复的时间显示 ,修改时间显示到小时分。

// ==UserScript==// @name 直接显示StackOverflow的答题日期, 增加评论区回复的时间显示 ,修改时间显示到小时分。// @namespace http://tampermonkey.net/// @version ...

FalconChen
今天
36
0
Shader笔记_005 纹理

纹理最初的目的就是使用一张图片来控制模型的外观,通过纹理映射技术 我们可以把一张图粘贴在物体表面,逐纹素的控制模型的颜色。 通常美术建模的时候也会在软件里利用纹理展开技术把纹理展开成...

STONE-CITY
今天
12
0
iOS MVVM 与RAC结合使用

MVVM配合 RAC 更能发挥的淋漓尽致。 我们把 MVVM 第一篇的例子 KVO 的事件 替换成 配合RAC 框架使用, OC的话直接导入 : pod 'ReactiveObjC' Swift 直接用 RXSwift就可以。 把 ViewModel里加...

T型人才追梦者
今天
22
1
OSChina 周一乱弹 —— 影响心情的三座大山

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《浮生(inst.)》- 忘乡 / 墨凡悦 手机党少年们想听歌,请使劲儿戳(这里) @凝小紫...

小小编辑
今天
49
0
Unity中头发渲染

头发与普通PBR 材质最大的区别是 头发是各项异性的高光, 参考实现主要为下面文章 http://web.engr.oregonstate.edu/~mjb/cs519/Projects/Papers/HairRendering.pdf 头发包含 2个高光,以及高...

liyong2
今天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部