文档章节

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

h
 hxlhxl0937
发布于 2016/10/04 12:06
字数 825
阅读 31
收藏 0
点赞 1
评论 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
广州
Web-安全-学习资料(很全)​

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

Ho0oH ⋅ 2017/09/26 ⋅ 0

XSS跨站脚本攻击

什么是XSS攻击  XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆。故将跨站脚本攻击缩写为XSS。XSS是一种经常出现在web应用中的计...

freeframe ⋅ 2012/09/03 ⋅ 4

网络与安全

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

掘金官方 ⋅ 01/11 ⋅ 0

Web 漏洞分析与防御之 XSS(一)

原文地址:Web 漏洞分析与防御之 XSS(一) 博客地址:www.extlight.com 一、全称 跨站脚本攻击(Cross Site Scripting) 二、原理 通过在网站中的输入框写入 script 脚本或引入 script 文件...

moonlightL ⋅ 2017/10/10 ⋅ 0

XSS漏洞分析

什么是XSS XSS可以干什么 XSS分类 反射(非持久)型XSS xss.php 提交 /xss.php?x= 服务端解析式,echo就会完整的输出 到响应体中,然后浏览器解析执行触发弹窗 储存(持久)型XSS #eg:http:...

nw01f ⋅ 2016/07/15 ⋅ 0

前端——影子杀手篇

前言 对于一个影子杀手而言,总能杀人于无形。前端也有影子杀手,它总是防不胜防地危害着你的网站 本篇打算介绍一些前端的影子杀手们——XSS和CSRF。或许,你对它恨之入骨;又或者,你运用的...

zimo ⋅ 2017/10/10 ⋅ 0

[Web安全之实战] 跨站脚本攻击XSS

Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points: 1. 认识XSS 2. XSS攻击 3. XSS防御(重点) 一、认识XSS先 先说个故事吧,在上一...

泥沙砖瓦浆木匠 ⋅ 2015/01/31 ⋅ 48

web安全之XSS

一、浏览器安全 1、同源策略(SOP) 在浏览器中,

TsingCall ⋅ 2017/09/26 ⋅ 0

AJAX请求真的不安全么?谈谈Web安全与AJAX的关系。

开篇三问 AJAX请求真的不安全么? AJAX请求哪里不安全? 怎么样让AJAX请求更安全? 前言 本文包含的内容较多,包括AJAX,CORS,XSS,CSRF等内容,要完整的看完并理解需要付出一定的时间。 另...

撒网要见鱼 ⋅ 01/04 ⋅ 0

AJAX请求真的不安全么?谈谈Web安全与AJAX的关系。

开篇三问 AJAX请求真的不安全么? AJAX请求哪里不安全? 怎么样让AJAX请求更安全? 前言 本文包含的内容较多,包括AJAX,CORS,XSS,CSRF等内容,要完整的看完并理解需要付出一定的时间。 另...

⋅ 01/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部