如何解决XSS攻击

分享于 

5分钟阅读

Web开发

  繁體 雙語

介绍

本文介绍如何解决XSS攻击,请看我以前介绍 XSS攻击的文章。

服务器端可以做的事情

1.HttpOnly

只允许在 http/https协议下读取 Cookie,不允许JavaScript读取 Cookies。 支持的浏览器是 IE 6 +,Firefox2+,Google,Safari4+。
将HttpOnly添加到Cookie中的JavaEE代码:

response.setHeader("Set-Cookie","cookiename=value; 
Path=/;Domain=domainvalue;Max-Age=seconds;HTTPOnly");

对于 HTTPS,我们还可以设置安全域来加密 cookie。 这样实际上禁止JavaScript读取 Cookie,这不是一个预防措施。

2.处理程序富文本

某些数据无法在服务器端加密,因为使用场景问题。 但是富文本是完全HTML代码,在输出时不能放入属性,所以你可以在服务器端处理它。 处理方法是设置标签和属性的白列表,不允许它具有特殊标签或者属性( 比如 )。 脚本,iframe,表单,等等 ),是的,是XSS过滤器。 在存储数据之前筛选数据。

有一个名为anti的Java开源项目,它是一个不错的XSS过滤器:

Policy ploicy = Policy.getInstance(POLICY_FILE_LOCATION);
AntiSamy as = new AntiSamy();
CleanResults cr = as.scan(dirtyInput, policy);
MyUserDao.storeUserProfile(cr.getCleanHTML());

当然,我们可以在客户端之前过滤数据,但是最好在服务器端做一次。

客户端可以做的事情

1.输入检查

输入检查也需要在服务器端进行,因为用户可以绕过JavaScript检查。 目前,最流行的方法是对客户端进行JavaScript检查,同时对服务器端执行相同的逻辑检查。 JavaScript输入检查可以防止大多数可能节省许多服务器资源的攻击。

简而言之,输入检查需要同时在客户端和服务器端完成。

In addition, the places that attacker can input XSS, e.g.
1. all input boxes on page
2.window.location(href,hash,etc)
3.window.named
4.document.referrer
5.document.cookie
6.localstorage
7.XMLHttpRequest returned data
Of course, not limit these ways.

2.输出检查

通常,当页面上的参数输出或者转义它们以防止XSS攻击时。
XSS攻击的本质是HTML注入,用户输入被认为是HTML的一部分。 因此,混淆原有意义,产生新意义。

The places that can trigger XSS:
1.document.write
2.xxx.innerHTML=
3.xxx.outerHTML=
4.innerHTML.replace
5.document.attachEvent
6.window.attachEvent
7.document.location.replace
8.document.location.assign

如果使用 jQuery,那就是使用'append'。'html'。'before'。'after'。等等 大多数MVC框架自动处理它的视图层的地方。 比如 AngularJS。

什么可以编码输出?

通常使用 HTMLEncodeJavaScriptEncode,客户端和服务器端都可以这样做。

  • HTMLEncode,换句话说,将 string 转换为 HTMLEntities,通常转换这些字符( &? <>"'/)。
  • JavaScriptEncode,使用''转换特殊字符。

需要编码的地方?

  • 在HTML标签中输出,属性--使用 HTMLEncode
  • JavaScript --标签中的输出使用 JavaScriptEncode
  • 事件中的输出--使用 JavaScriptEncode。 换句话说, <a href="#" onclick="funcA('$var')">test</a>
  • 在 CSS --中输出使用类似于JavaScript的方式,将除字母和数字以外的所有字符编码为十六进制格式" uHH"
  • 如果参数是整个URL地址,则在 URL --中输出,然后检查参数是否以'http'开头,如果不是,则添加'http'以防止假协议XSS攻击,然后使用 URLEncode 进行参数编码。

p。s: URLEncode 可以将字符转换为" %HH"格式。

摘要

前端开发者必须知道正确的编码方法在正确的地方使用。 有时,我们需要同时使用 HTMLEncodeJavaScriptEncode,而不是总是使用一个方法。


ATT  XSS  
相关文章