处理XSS是做ipo 输入 处理 输出过滤好还是输出过滤好

XSS安全性过滤 - yingchen - 博客园
XSS攻击很多发生在用户在可以输入的地方输入了不友好的内容,根本处理方法是在输入内容中进行过滤
PHP或者java,基本都有现成的jar包或者php框架,调用自动过滤用户的输入内容,避免了XSS
防御的方式有以下几种:
1、HttpOnly防止劫取Cookie
HttpOnly最早由微软提出,至今已经成为一个标准。浏览器将禁止页面的Javascript访问带有HttpOnly属性的Cookie。很多网站将用来认证的cookies设置为httponly
很多简单的xss攻击就是输入js来获取cookies等信息,关键cookies设置为httponly有效避免了这种情况
2、输入检查
输入检查一般是检查用户输入的数据中是否包含一些特殊字符,如&、&、'、"等,如果发现存在特殊字符,则将这些字符过滤或者编码。这里基本用现成框架内容即可
3、输出检查
大多人都知道输入需要做检查,但却忽略了输出检查。
在HTML标签中输出
$a&=&"&script&alert(1);&/script&";&&
$b&=&"&img&src=#&onerror=alert(2)&/&";&&
&div&&?=$b?&&/div&&&
&a&href="#"&&?=$a?&&/a&&&
这样客户端受到xss攻击,解决方法就是对变量使用htmlEncode,php中的函数是htmlentities
$a&=&"&script&alert(1);&/script&";&&
$b&=&"&img&src=#&onerror=alert(2)&/&";&&
&div&&?=htmlentities($b)?&&/div&&&
&a&href="#"&&?=htmlentities($a)?&&/a& &
在HTML属性中输出
Html代码&&
这种情况防御也是使用htmlEncode在owasp-php中实现:
$immune_htmlattr&=&array(',',&'.',&'-',&'_');&&
$this-&htmlEntityCodec-&encode($this-&immune_htmlattr,&"\"&&script&123123;&/script&&\"");&&
在&script&标签中输出
$c&=&"1;alert(3)";&&
&script&type="text/javascript"&&&
&&&&var&c&=&&?=$c?&;&&
&/script&&&
&这样xss又生效了。首先js变量输出一定要在引号内,但是如果我$c = "\"alert(123);//",你会发现放引号中都没用,自带的函数都不能很好的满足。这时只能使用一个更加严格的JavascriptEncode函数来保证安全&&除数字、字母外的所有字符,都使用十六进制"\xHH"的方式进行编码。这里我采用开源的owasp-php方法来实现
$immune&=&array("");&&
echo&$this-&javascriptCodec-&encode($immune,&"\"alert(123);//");&&
最后输出\x22abc\x3Balert\x2B\x2F\x2F
在事件中输出
Html代码&&
可能攻击方法
Html代码&&
这个其实就是写在&script&中,所以跟3防御相同
在css中输出
在owasp-php中实现:
$immune&=&array("");&&
$this-&cssCodec-&encode($immune,&'background:expression(window.x?0:(alert(/XSS/),window.x=1));');&&
在地址中输出先确保变量是否是"http"开头,然后再使用js的encodeURI或encodeURIComponent方法。
在owasp-php中实现:
$instance&=&ESAPI::getEncoder();&&
$instance-&encodeForURL(&url&); &
4、防御DOM Based XSS
DOM Based XSS是从javascript中输出数据到HTML页面里。
&script&&&
var&x&=&"$var";&&
document.write("&a&href='"+x+"'&test&/a&");&&
&/script&&&
按照三中输出检查用到的防御方法,在x赋值时进行编码,但是当document.write输出数据到HTML时,浏览器重新渲染了页面,会将x进行解码,因此这么一来,相当于没有编码,而产生xss。
防御方法:首先,还是应该做输出防御编码的,但后面如果是输出到事件或脚本,则要再做一次javascriptEncode编码,如果是输出到HTML内容或属性,则要做一次HTMLEncode。
会触发DOM Based XSS的地方有很多:
document.write()、document.writeln()、xxx.innerHTML=、xxx.outerHTML=、innerHTML.replace、document.attachEvent()、window.attachEvent()、document.location.replace()、document.location.assign()404 Not Found
404 Not Found
The requested URL was not found on this server.Powered by GFW 2.0推荐这篇日记的豆列
······9418人阅读
【Web安全】(6)
说到 XSS 攻击,前边已经有两篇文章在讲这个事了,这次又拿出来说,主要是针对最近工作中的一些新的问题。那么之前是怎么解决这个问题的呢?为什么又要换解决方案?下面就详细的跟大家分享一下。
公司的测试团队发现这个问题之后,就要求尽快的解决,在网上查了很多相关的资料,也翻阅了基本安全方面的书,基于 XSS 的攻击原理,自己写了一个 Filter,并在该 Filter 中加入了对各种请求的处理代码。首先是拦截浏览器发出的请求,然后对拦截到的请求进行过滤,获取参数列表,参数值列表(包括表单提交),然后对这些参数值进行危险字符的过滤处理,处理的过程中分为两种情况。
其中一种是把危险字符进行转换,保留原来的语意,在适当的时候进行还原,当然,这种情况下危险字符还是存在的,只不过是换了一种相对安全的形式。这种情况的好处是,保证了请求的原始性,但是对数据库或文件系统产生一些不必要的垃圾信息。为什么这么说呢,因为普通的用户在正常的操作下是不会包含这些非法字符的,只有在非法入侵的情况下才会出现这种情况,而对于危险字符的转换就是一种间接的保护措施。
对于第二种情况,不是对危险字符进行转换,而是把请求中的危险字符进行过滤,使得请求纯净化,把非法的字符过滤掉,这样以来,进入数据库或文件系统的就仅仅是合法的语句。这种情况也会有他的利弊。比如,在过滤的过程中,可能把用户的某些正常请求参数值也给清理掉,这样就不能保证请求的原始性。但系统的安全性方面却大大的提高了。为了避免用户的请求失真,我们能做的就是尽量的避开用户可以输入的特殊字符,在注册、登录、或者其他的请求中,规定用户可以使用的特殊字符,对那些不提倡使用的字符进行过滤和处理。
在旧的的方案提交给测试团队之后,很大一部分的 XSS 攻击问题已经不存在了,但又出现了另外一个问题,在登录的过程中,偶尔会把验证码给过滤掉,还有一些不定的 URL 会时不时的漏掉,虽然在 web.xml 配置了全局的请求,但还是会出现这样的问题。测试团队给出的报告中显示,还有少量的 XSS 攻击存在,让我尽快解决。
针对这个问题,我又研究了问题所在区域的源代码,并结合自己写的 XSSFilter,发现了2点问题。
其一,是后台的验证逻辑并不完整,对于提交过来的请求,并没有进行相应的处理。
其二,是 XSSFilter 写的有问题,正如我上面讲到的情况一,只是把危险字符进行转换,并没有从根本上解决问题。
俗话说,久病成良医。那么,总想着一件事,问题解决起来也总会是事半功倍的。
对于出现的问题,我这里有两点需要说,其一就是针对后台的验证逻辑,这个没有必要再详细说了,无非就行完善验证逻辑,针对可能出现的情况进行抽象,抽出通用的验证逻辑,对于个别的验证就单独处理,不过还是要考虑代码的复用性。
其二,是关于 XSS 攻击全局处理的。我这里给出两种解决方案,详述如下。
如果你遇到的情况,对与用户的输入、输出有明确的限制,而且对于特殊字符也有明确的规定,那么你可以自己写一个 XSSFilter,使用上面提到的情况二,对不建议输入的特殊字符进行过滤和清理,包括 SQL 注入的一些敏感信息,都是要过滤掉的。基本的 Filter 网上都有,你要做的就是针对自己的业务,再加入对危险字符的处理即可。
想到一句老话,站在巨人的肩膀上。第二种方案,就是站在巨人的肩膀上。推荐一款开源插件,xssProject,具体作者不详。GoogleCode 中提供相应了的源代码。想研究的可以自己去找一下。下面着重讲一下,如何在项目中集成 xssProject,并使之为我们服务。
首先,项目中需要引入 xssProtect-0.1.jar、antlr-3.0.1.jar、antlr-runtime-3.0.1.jar 等3个 jar 包。
然后,封装 request,代码如下。
&span style=&font-family:Comic Sans MS;&&public class NewXssHttpServletRequestWrapper extends HttpServletRequestWrapper {
HttpServletRequest orgRequest =
public NewXssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
orgRequest =
* 覆盖getParameter方法,将参数名和参数值都做xss过滤。&br/&
* 如果需要获得原始的值,则通过super.getParameterValues(name)来获取&br/&
* getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
public String getParameter(String name)
System.out.println(&NewXssFilter处理前的 Value = & + super.getParameterValues(name));
String value = super.getParameter(xssEncode(name));
if (value != null)
value = xssEncode(value);
System.out.println(&NewXssFilter处理后的 Value = & + value);
* 覆盖getHeader方法,将参数名和参数值都做xss过滤。&br/&
* 如果需要获得原始的值,则通过super.getHeaders(name)来获取&br/& getHeaderNames 也可能需要覆盖
public String getHeader(String name)
String value = super.getHeader(xssEncode(name));
if (value != null)
value = xssEncode(value);
* 将容易引起xss漏洞的半角字符直接替换成全角字符
* @param s
private static String xssEncode(String s)
if (s == null || s.isEmpty())
StringReader reader = new StringReader( s );
StringWriter writer = new StringWriter();
HTMLParser.process( reader, writer, new XSSFilter(), true );
return writer.toString();
catch (NullPointerException e) {
catch(Exception ex)
ex.printStackTrace();
* 获取最原始的request
public HttpServletRequest getOrgRequest()
return orgR
* 获取最原始的request的静态方法
public static HttpServletRequest getOrgRequest(HttpServletRequest req)
if (req instanceof NewXssHttpServletRequestWrapper)
return ((NewXssHttpServletRequestWrapper) req).getOrgRequest();
再然后,创建过滤器 NewXssFilter 。
&span style=&font-family:Comic Sans MS;&&public class NewXssFilter implements Filter {
FilterConfig filterConfig =
public void destroy() {
this.filterConfig =
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
String path = ((HttpServletRequest) request).getContextPath();
String basePath = request.getScheme() + &://& + request.getServerName()
+ &:& + request.getServerPort() + path + &/&;
// HTTP 头设置 Referer过滤
String referer = ((HttpServletRequest) request).getHeader(&Referer&); // REFRESH
if (referer != null && referer.indexOf(basePath) & 0) {
((HttpServletRequest) request).getRequestDispatcher(
((HttpServletRequest) request).getRequestURI()).forward(
((HttpServletRequest) request), response);
System.out.println(&referer不为空,referer &&&&&&&&&&&&&& & + referer);
NewXssHttpServletRequestWrapper xssRequest = new NewXssHttpServletRequestWrapper((HttpServletRequest) request);
chain.doFilter(xssRequest, response);
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterC
最后,在 web.xml 中配置过滤器 。
&span style=&font-family:Comic Sans MS;&&&filter&
&filter-name&XssSqlFilter&/filter-name&
&filter-class&com.***.mon.NewXssFilter&/filter-class&
&filter-mapping&
&filter-name&XssSqlFilter&/filter-name&
&url-pattern&/*&/url-pattern&
&dispatcher&REQUEST&/dispatcher&
&/filter-mapping&&/span&
以上这些就是全部的内容了,针对 XSS 攻击的解决方案,写出来跟大家分享,个人建议使用 xssProject 来解决这一问题。毕竟 xssProject 已经提供了很完善的过滤、处理方案,你可以通过研究他的代码来进行扩展,如果需要的话。最后附上 xssProject 所需的三个 jar 包。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:671674次
积分:9303
积分:9303
排名:第1532名
原创:167篇
转载:20篇
评论:1222条
(3)(2)(4)(4)(4)(4)(4)(6)(2)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(5)(3)(4)(4)(4)(4)(4)(4)(5)(4)(4)(4)(5)(5)(3)(4)(4)(2)(2)(8)(2)(4)(6)(10)

我要回帖

更多关于 防止xss攻击 前端过滤 的文章

 

随机推荐