2019独角兽企业重金招聘Python工程师标准>>>

跨站攻击,即Cross Site Script Execution(通常简写为XSS,因为CSS与层叠样式表同名,故改为XSS) 是指攻击者利用网站程序对用户输入过滤不足,输入可以显示在页面上对其他用户造成影响的HTML代码,从而盗取用户资料、利用用户身份进行某种动作或者对访问者进行病毒侵害的一种攻击方式。 这种漏洞(XSS)通常用于发动cookie窃取、恶意软件传播(蠕虫攻击),会话劫持,恶意重定向。


        像在上方这种类型的网站,如果提交搜索的内容为为: </div><script type="text/javascript">alert('跨站攻击啦')</script><div>

那么在点击搜索后,页面会弹出alert提示信息:跨站攻击啦

对其他用户有什么威胁呢?仅针对此情况来说,正常情况下,A用户提交内容后,服务器都会将内容保存到数据库服务器中,那么B用户如果访问到了A用户评论的那个界面就会弹出上面的对话框。这就影响了网站整体体验。

       解决办法:  后台给div赋值时候,请用html encode编码将上面btn按钮的事件,您搜索的内容是:HttpUtility.HtmlEncode(txtSearch.Text.Trim()) 就行了。 如下图,就不会弹出对话框来了,而是将搜索内容完全展示出来。

我们来查看html源码,看见 html标签信息都被编码了,这样浏览器就不知道这是一个脚本代码

<div id="MainContent_result">您搜索的内容是: &lt;/div&gt;&lt;script type=&quot;text/javascript&quot;&gt;alert('跨站攻击鸟')&lt;/script&gt;&lt;div&gt;</div>

上面 面演示的是一个非常简单的XSS攻击,还有很多隐蔽的方式,但是其核心都是利用了脚本注入。因此我们解决办法其实很简单:不信赖用户输入,对特殊字符如”<”,”>”转义,就可以从根本上防止这一问题。当然很多解决方案都对XSS做了特定限制,但防不胜防,总有些聪明的恶意用户会到我们的网站搞破坏,对自己站点不放心可以看看这个XSS跨站测试代码大全试试站点是否安全。

XSS攻击可以进行session劫持:Hack通过脚本注入到应用服务器,待其他真实用户A登录访问含有XSS脚本的网页,脚本激活,将客户的session信息发送给Hack,Hack就使用该session直接扮演用户A访问服务器。这种session劫持主要靠XSS漏洞和客户端获取sessionId完成,防范分两步:

1、过滤用户输入,防止XSS漏洞

2.、设置sessionId的cookie为HttpOnly,使客户端无法获取

参考:

http://www.cnblogs.com/StudyLife/p/3514038.html

http://www.cnblogs.com/dolphinX/p/3391351.html

http://www.cnblogs.com/dolphinX/p/3403027.html

http://www.cnblogs.com/dsky/archive/2012/04/06/2434768.html

http://netsecurity.51cto.com/art/201310/414089_1.htm

下面给出struts2中对url进行拦截判断是否存在xss脚本攻击的案例:

重写struts2的拦截器为SCVStrutsFilter

import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;import javax.servlet.FilterChain;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;
import org.apache.struts2.util.URLDecoderUtil;public class SCVStrutsFilter extends StrutsPrepareAndExecuteFilter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException {HttpServletRequest req = (HttpServletRequest) request;String target = req.getRequestURI();if (checkXss(target)) {((HttpServletResponse) response).sendRedirect(req.getContextPath() + "/jsp/common/security.jsp");return;}super.doFilter(request, response, chain);}/*** 校验是否含XSS脚本* * @param value* @return*/private boolean checkXss(String value) {boolean flag = false;if (StringUtils.isNotBlank(value)) {try {// URL解码String decodeFirst = URLDecoder.decode(value, "UTF-8");String decodeSec = URLDecoder.decode(decodeFirst, "UTF-8");// 检查第一次解码是否存在XSSflag = XssShieldUtil.matcherXss(decodeFirst);// 如果第一次解码已经存在XSS或两次解码一样则不进行第二次解码检验if (!flag && !StringUtils.equals(decodeFirst, decodeSec)) {flag = XssShieldUtil.matcherXss(decodeSec);}} catch (Exception e) {log.error("请求URL解码出错", e);}}return flag;}}

对应XSS脚本检测工具类XssShieldUtil如下

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import org.apache.commons.lang.StringUtils;/*** XSS脚本过滤工具*/
public class XssShieldUtil {/*** 默认的XSS攻击脚本匹配规则*/private static List<Pattern> patterns = null;static {patterns = new ArrayList<Pattern>();// 匹配<script>***</script>patterns.add(Pattern.compile("<(no)?script[^>]*>.*?</(no)?script>", Pattern.CASE_INSENSITIVE));// 匹配eval(***)patterns.add(Pattern.compile("eval\\s*\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE| Pattern.DOTALL));// 匹配expression(***)patterns.add(Pattern.compile("expression\\s*\\((.*?)\\)", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE| Pattern.DOTALL));// 匹配javascript:或vbscript:或view-source:patterns.add(Pattern.compile("(javascript\\s*:|vbscript\\s*:|view-source\\s*:)+", Pattern.CASE_INSENSITIVE));// 匹配<>或<**'##'**"##"**>patterns.add(Pattern.compile("<(\"[^\"]*\"|\'[^\']*\'|[^\'\">])*?>", Pattern.CASE_INSENSITIVE| Pattern.MULTILINE | Pattern.DOTALL));// 匹配window.location或window.或.location或document.cookie或document.或alert(***)或或window.openpatterns.add(Pattern.compile("(window\\.location|window\\.|\\.location|document\\.cookie|document\\.|alert\\s*\\(.*?\\)|window\\.open)+",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL));// 匹配“<”开头里面含有window事件且“>”结尾patterns.add(Pattern.compile("<+\\s*\\w*\\s*(oncontrolselect|oncopy|oncut|ondataavailable|ondatasetchanged|ondatasetcomplete|ondblclick|ondeactivate|ondrag|ondragend|ondragenter|ondragleave|ondragover|ondragstart|ondrop|onerror=|onerroupdate|onfilterchange|onfinish|onfocus|onfocusin|onfocusout|onhelp|onkeydown|onkeypress|onkeyup|onlayoutcomplete|onload|onlosecapture|onmousedown|onmouseenter|onmouseleave|onmousemove|onmousout|onmouseover|onmouseup|onmousewheel|onmove|onmoveend|onmovestart|onabort|onactivate|onafterprint|onafterupdate|onbefore|onbeforeactivate|onbeforecopy|onbeforecut|onbeforedeactivate|onbeforeeditocus|onbeforepaste|onbeforeprint|onbeforeunload|onbeforeupdate|onblur|onbounce|oncellchange|onchange|onclick|oncontextmenu|onpaste|onpropertychange|onreadystatechange|onreset|onresize|onresizend|onresizestart|onrowenter|onrowexit|onrowsdelete|onrowsinserted|onscroll|onselect|onselectionchange|onselectstart|onstart|onstop|onsubmit|onunload)+\\s*=+",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL));}/*** XSS脚本匹配* * @param value* @return*/public static boolean matcherXss(String value) {boolean flag = false;if (StringUtils.isNotBlank(value)) {Matcher matcher = null;for (Pattern pattern : patterns) {matcher = pattern.matcher(value);if (matcher.find()) {flag = true;log.error("拦截URL存在XSS攻击:" + value);break;}}}return flag;}/*** XSS脚本清除* * @param value* @return*/public static String stripXss(String value) {if (StringUtils.isNotBlank(value)) {Matcher matcher = null;for (Pattern pattern : patterns) {matcher = pattern.matcher(value);// 匹配if (matcher.find()) {System.out.println(value);System.out.println(matcher.pattern());// 删除相关字符串value = matcher.replaceAll("");}}value = value.replaceAll("<", "&lt;").replaceAll(">", "&gt;");}return value;}public static void main(String[] args) {// Pattern p = Pattern.compile("<(no)?script[^>]*>.*?</(no)?script>", Pattern.CASE_INSENSITIVE);// Matcher matcher = p.matcher("<script language=text/javascript>alert(document.cookie);</script>");// System.out.println(matcher.find());// System.out.println(StringEscapeUtils.escapeHtml("<sdsjavascript img=\"http://sds/sds.jsp\">"));String value = null;value = XssShieldUtil.stripXss("<script language=text/javascript>alert(document.cookie);</script>");System.out.println("type-1: '" + value + "'");value = XssShieldUtil.stripXss("<script src='' onerror='alert(document.cookie)'></script>");System.out.println("type-2: '" + value + "'");value = XssShieldUtil.stripXss("</script>");System.out.println("type-3: '" + value + "'");value = XssShieldUtil.stripXss(" eval   (abc);");System.out.println("type-4: '" + value + "'");value = XssShieldUtil.stripXss(" expression(abc);");System.out.println("type-5: '" + value + "'");value = XssShieldUtil.stripXss("<img src='' onerror='alert(document.cookie);'></img>");System.out.println("type-6: '" + value + "'");value = XssShieldUtil.stripXss("<img src='' onerror='alert(document.cookie);'/>");System.out.println("type-7: '" + value + "'");value = XssShieldUtil.stripXss("<img src='' onerror='alert(document.cookie);'>");System.out.println("type-8: '" + value + "'");value = XssShieldUtil.stripXss("<script language=text/javascript>alert(document.cookie);");System.out.println("type-9: '" + value + "'");value = XssShieldUtil.stripXss("<script>window.location='url'");System.out.println("type-10: '" + value + "'");value = XssShieldUtil.stripXss(" onload='alert(\"abc\");");System.out.println("type-11: '" + value + "'");value = XssShieldUtil.stripXss("<img src=x'<!--<\"-->>");System.out.println("type-12: '" + value + "'");value = XssShieldUtil.stripXss("<=img onstop=");System.out.println("type-13: '" + value + "'");}
}

转载于:https://my.oschina.net/u/163737/blog/780662

如何尽量规避XSS(跨站点脚本)攻击相关推荐

  1. ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)

    本博文翻译自: https://dotnetcoretutorials.com/2017/10/25/owasp-top-10-asp-net-core-cross-site-scripting-xs ...

  2. 记录如何防止跨站点脚本攻击之抄写

    一.简介 跨站点脚本(XSS)是当前web应用中最危险和最普遍的漏洞之一.安全研究人员在大部分最受欢迎的网站,包括Google, Facebook, Amazon, PayPal等网站都发现这个漏洞. ...

  3. 基于IE的MIME sniffing功能的跨站点脚本攻击

    IE有一个特性,那就是在将一个文件展示给用户之前会首先检查文件的类型,这乍看起来并没什么问题,但实际上这是相当危险的,因为这会允许IE执行图片中的代码,即嵌入在一个图像中的JavaScript代码.引 ...

  4. 如何防止跨站点脚本攻击

    1. 简介 跨站点脚本(XSS)是当前web应用中最危险和最普遍的漏洞之一.安全研究人员在大部分最受欢迎的网站,包括Google, Facebook, Amazon, PayPal等网站都发现这个漏洞 ...

  5. 安全编码实践之二:跨站点脚本攻击防御

    安全编码实践之二:跨站点脚本攻击防御 声明:本文由Bypass整理并翻译,仅用于安全研究和学习之用. 文章来源:https://medium.com/bugbountywriteup/how-to-w ...

  6. 使用AntiXss.HtmlEncode方法来防止跨站点脚本攻击,后解码

    使用AntiXss.HtmlEncode方法来防止跨站点脚本攻击中文会被转码, 可使用Sanitizer.GetSafeHtmlFragment(string inpu)方法来进行解码. 转码: 解码 ...

  7. 防止跨站点脚本注入_防止跨站点脚本攻击

    防止跨站点脚本注入 大多数现有的浏览器都能够解释和执行脚本,这些脚本以诸如JavaScript,JScript,VBScript之类的脚本语言创建,并嵌入在从Web服务器下载的网页中. 当攻击者将恶意 ...

  8. 如何防止跨站点脚本 (XSS) 攻击完整指南

    跨站点脚本 (XSS) 攻击的完整指南.如何防止它以及 XSS 测试. 跨站点脚本 (XSS) 是每个高级测试人员都知道的最流行和易受攻击的攻击之一.它被认为是对 Web 应用程序最危险的攻击之一,也 ...

  9. 跨站点脚本(XSS)

    1. 简介 跨站点脚本(XSS)是当前web应用中最危险和最普遍的漏洞之一.安全研究人员在大部分最受欢迎的网站,包括Google, Facebook, Amazon, PayPal等网站都发现这个漏洞 ...

最新文章

  1. 印度小哥“神剑”:PDF提取表格so easy!
  2. 特征工程(feature engineering)是什么?特征工程(feature engineering)包含哪些方面?
  3. 微信-js sdk invalid signature签名错误 问题解决
  4. 在SQL Server 2005 Express 中添加报表服务后 (Business Intelligence Development Studio) vs2005 加载程序集问题解决办法...
  5. 《告别失控:软件开发团队管理必读》一一1.2 成功的程序设计经理为什么难当...
  6. php get_extension_funcs,get_extension_funcs()
  7. 六、数据的基本统计描述
  8. PHP面试题:合并两个数组有几种方式,试比较它们的异同
  9. android 决TextView中MaxLines与ellipsize=end冲突问题
  10. SharpReader的效率:支持meme聚合
  11. c#url拼接方法名_c# 获取url参数的五种方法
  12. OrCAD 与 Cadence Allegro PCB 入门 - 以 16.6版本为例 (1)
  13. 品牌笔记本预装windows的OEM分区解决方案(联想)
  14. nginx-http重定向到https配置
  15. win7总是显示计算机内存不足怎么办,win7系统电脑总是提示“计算机的内存不足”的解决方法...
  16. 非线性激励函数sigmoid,tanh,softplus,Relu
  17. pygame简单伪3d赛车赛道
  18. 关于百度云在线视频加速的解决方法(不用另外软件)
  19. U盘出现了0字节怎么找回数据
  20. LINUX CENTOS /VAR/LIB/DOCKER/CONTAINER目录导致系统存储爆满,占用大量存储解决方案

热门文章

  1. win7您需要来自计算机管理员的权限,win7需要提供管理员权限才能打开文件怎么解决...
  2. android 下一步,在Android上单击“软键盘下一步”时,移至另一个EditText
  3. linux chrome无法上网,Chromium浏览器(Linux Chrome)无法显示WebGL
  4. oracle查看本机字符集,查看、修改oracle字符集,查看oracle版本
  5. fragment photoshop_史上最接地气的Photoshop?谈PS 2021的黑科技 - Adobe
  6. flask request传参
  7. python `__format__`
  8. OscillatorNode
  9. Java JDBC spring-jdbc
  10. 2.14 向量化 logistic 回归的梯度输出