`
conkeyn
  • 浏览: 1528943 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

XSS跨站脚本攻击在Java开发中防范的方法

 
阅读更多
详细描述 跨站脚本攻击(也称为XSS)指利用网站漏洞从用户那里恶意盗取信息。用户在浏览网站、使用即时通讯软件、甚至在阅读电子邮件时,通常会点击其中的链接。攻击者通过在链接中插入恶意代码,就能够盗取用户信息或在终端用户系统上执行恶意代码。

成功的跨站脚本攻击所带来的主要问题包括:

帐号劫持 - 攻击者可以在会话cookie过期之前劫持用户的会话,并以访问ULR用户的权限执行操作,如发布数据库查询并查看结果。

恶意脚本执行 - 用户可能在不知情的情况下执行攻击者注入到动态生成页面中的JavaScript、VBScript、ActiveX、HTML甚至Flash内容。

蠕虫传播 - 通过Ajax应用,跨站脚本可以以类似于病毒的方式传播。跨站脚本负载可以自动将其自身注入到页面中,并通过更多的跨站脚本轻易的重新注入同一主机,而
所有这些都无需手动刷新页面。因此,跨站脚本可以使用复杂的HTTP方式发送多个请求,并以用户不可视的方式自我传播。

信息窃取 - 攻击者可以通过重新定向和伪造站点将用户连接到攻击者所选择的恶意服务器并获得用户所输入的任何信息。

拒绝服务 - 通常攻击者通过在包含有跨站脚本漏洞的站点上使用畸形的显示请求,就可以导致主机站点反复的自我查询,出现拒绝服务的情况。

浏览器重新定向 - 在某些使用帧的站点上,用户可能在实际上已经被重新定向到恶意站点的情况下误导为仍处在原始站点上,因为浏览权地址栏中的URL仍保持不变。这是由于没有重新定向整个页面,而只是执行JavaScript的帧。

控制用户设置 - 攻击者可以恶意更改用户设置。
本漏洞属于Web应用安全常见漏洞。
解决办法 推荐措施包括实施安全编程技术确保正确过滤用户提供的数据,并编码所有用户提供的数据以防以可执行的格式向终端用户发送注入的脚本。

对于开发
========

可通过仔细验证所有输入和正确编码所有输出来防范跨站脚本攻击。可使用标准的ASP.NET验证控件或直接在代码中实施验证,要尽可能使用严格的模版。

输出编码要确保在将内容发送给客户端之前对任何可脚本化的内容都进行了正确的HTML编码。可通过HttpUtility.HtmlEncode函数实现,如以下Label控件示例所示:

Label2.Text = HttpUtility.HtmlEncode(input)

要考虑用户输入通过应用可能用到的所有路径。例如,如果数据是由用户输入的,存储在数据库中,然后再重新显示,就必须要确保在每次检索的时候都能正确编 码。如果必须允许自由格式文本输入(如在消息板中),而又希望允许使用一些HTML格式,则可以通过仅明确允许很小的安全标签列表来安全的处理这种情况, 如下所示:

C#示例:
StringBuilder sb = new StringBuilder(HttpUtility.HtmlEncode(htmlInputTxt.Text));
sb.Replace("&amp;lt;b&amp;gt;", "<b>");
sb.Replace("&amp;lt;/b&amp;gt;", "</b>");
sb.Replace("&amp;lt;i&amp;gt;", "<i>");
sb.Replace("&amp;lt;/i&amp;gt;", "</i>");
Response.Write(sb.ToString());

VB.NET示例:
Dim sb As StringBuilder = New StringBuilder( _
HttpUtility.HtmlEncode(input))
sb.Replace("&amp;lt;b&amp;gt;", "<b>")
sb.Replace("&amp;lt;/b&amp;gt;", "</b>")
sb.Replace("&amp;lt;i&amp;gt;", "<i>")
sb.Replace("&amp;lt;/i&amp;gt;", "</i>")
Response.Write(sb.ToString())

Java示例:
public static String HTMLEncode(String aText){
final StringBuilder result = new StringBuilder();
final StringCharacterIterator iterator = new StringCharacterIterator(aText);
char character = iterator.current();
while (character != CharacterIterator.DONE ){
if (character == '<') {
result.append("&amp;lt;");
}
else if (character == '>') {
result.append("&amp;gt;");
}
else if (character == '&') {
result.append("&amp;amp;");
}
else if (character == '\"') {
result.append("&amp;quot;");
}
else {
//the char is not a special one
//add it to the result as is
result.append(character);
}
character = iterator.next();
}
return result.toString();
}

以下建议可帮助构建能够抵御跨站脚本攻击的web应用。

定义允许的内容。确保web应用对所有输入参数(cookies、头、查询字符串、表单、隐藏字段等)验证严格定义的预期结果。

检查POST和GET请求的响应,确保返回内容是预期的且有效。

通过编码用户提供的数据从用户输入中删除冲突字符、括号、单双引号。这可以防范以可执行的方式向终端用户发送注入的脚本。

在可能的时候将所有客户端提供的数据仅限于字母数字的数据。使用这种过滤方案时,如果用户输入 了<script>alertdocumentcookie( 'aaa') </script>,就会被减少为scriptalertdocumentcookiescript。如果必须使用非字母数字字符,在 HTTP响应中使用之前将其编码为HTML实体,这样就无法将其用于修改HTML文档的结构。

使用双重用户认证机制而不是单重认证。

在修改或使用脚本之前确认其来源。

在自己的代码中使用时不要明确的信任任何来自他人的脚本,无论是从web下载还是来自熟人。

大多数服务器端脚本语言都提供了内嵌方式将输入变量的值转换为正确的不可解释HTML。应使用这种方式在将输入显示给客户端之前过滤所有输入。

PHP: string htmlspecialchars (string string [, int quote_style])

ASP / ASP.NET: Server.HTMLEncode (strHTML String)

对于安全操作
============

服务器端编码指的是首先通过编码函数发送所有的动态内容,使用所选择字符集中的代码替换Scripting标签,这可以帮助防范跨站脚本攻击。服务器端编码的缺点是可能耗费资源,对一些web服务器的性能产生负面影响。

如果必须允许站点用户使用HTML标签,如允许用户使用的格式化标签的公告栏,则应限制可使用的标签。创建可接受标签的列表,如粗体字、斜体字或下划线,并仅允许使用这些,拒绝任何其他标签。以下是一些可帮助检测跨站脚本的正则表达式。

简单跨站脚本攻击的正则表达式:
/((\%3C)|<)((\%2F)|\/)*[a-z0-9\%]+((\%3E)|>)/ix

应如下将上述正则表达式添加到新的Snort规则:

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"NIICross-Site Scripting attempt"; flow:to_server,established;pcre:"/((\%3C)|<)((\%2F)|\/)*[a-z0-9\%]+((\%3E)|>)/i";classtype:Web-application-attack; sid:9000; rev:5;)

跨站脚本攻击的偏执行正则表达式:
/((\%3C)|<)[^\n]+((\%3E)|>)/I

这条特征仅仅查找起始的HTML标签及其对等的16进制,之后的一个或多个字符为非换行符,再之后为结尾标签或其对等的16进制。这可能导致一些误报,具 体取决于Web应用和Web服务器的架构。但这种方式可以确保捕获任何攻击,甚至远程类似的跨站脚本攻击。对于公众方面,可以加强教育程序,帮助用户防范 可用于帐号劫持和其他形式身份窃取的在线欺诈,如网络钓鱼。

对于质量保证
============

修复跨站脚本漏洞最终要求基于代码的修复。“对于开发”和“对于安全操作”部分所述步骤可为开发人员提供修复这些问题所需的信息。以下步骤概括了如何对应用程序手动测试跨站脚本。

步骤1. 在浏览器中打开任意Web站点,查找可接受用户输入的位置,如搜索表单或某些登录页面。在搜索框中输入test并发送给Web服务器。

步骤2. 寻找返回类似于Your search for 'test' did not find any items或Invalid login test页面的WEB服务器。如果结果页面中出现了test,请继续。

步骤3. 如果要测试跨站脚本,在之前使用的同一搜索或登录框中输入<script>alert('hello')</script>字符串并发送给Web服务器。

步骤4. 如果服务器所响应的弹出框显示hello,则站点受跨站脚本影响。

步骤5. 即使步骤4失败,站点没有返回这条信息,仍可能存在风险。在浏览器中点击“查看源码”选项,查看Web页面的实际HTML代码。现在查找发送给服务器 的<script>字符串,如果在源码中看到整个<script>alert('hello')</script> 文本,则Web服务器受跨站脚本的影响。
分享到:
评论

相关推荐

    springmvc4配置防止XSS攻击的方法

    特别是在Web应用中,跨站脚本攻击(XSS)和SQL注入攻击是常见的安全威胁。XSS攻击是指攻击者通过在网页中嵌入恶意脚本代码,当其他用户浏览该网页时,恶意代码会执行,导致用户信息泄露、网站内容篡改等问题。而SQL...

    XSS跨域攻击在web项目中的防范,基于antisamy技术

    XSS(Cross-Site Scripting)跨站脚本攻击是一种常见的网络安全漏洞,它允许恶意用户在Web应用程序中注入可执行的脚本代码。这些注入的脚本可能在其他用户的浏览器中执行,导致敏感数据泄露、会话劫持、钓鱼攻击等...

    浅谈跨网站脚本攻击(XSS)的手段与防范(简析新浪微博XSS攻击事件)

    新浪微博攻击事件跨网站脚本(Cross-sitescripting,通常简称为XSS或跨站脚本或跨站脚本攻击)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受...

    java 预防XSS攻击

    在Java开发过程中,XSS(Cross Site Scripting)攻击是一种常见的安全威胁,它允许攻击者在用户的浏览器上执行恶意脚本。XSS攻击通常发生在Web应用程序未能充分验证或过滤用户输入的情况下,使得恶意代码能够被嵌入...

    JAVA防止XSS注入,附jar包

    在网络安全领域,XSS(Cross-Site Scripting)攻击是一种常见的威胁,它允许攻击者通过在网页中插入恶意脚本来窃取用户数据或控制用户的浏览器。对于Java开发人员来说,防止XSS注入至关重要,因为这有助于确保应用...

    开发代码安全规范-防SQL注入和XSS跨站攻击代码编写规范.docx

    开发代码安全规范旨在确保软件开发过程中对SQL注入和XSS跨站攻击的防范,这是互联网应用开发中的两个重要安全问题。以下是对这两个安全威胁的详细解释以及对应的代码编写规范: **SQL注入** 是一种常见的攻击手段,...

    spring boot xss防御

    在Spring Boot应用中,XSS(Cross Site Scripting,跨站脚本攻击)是一种常见的安全威胁,它允许攻击者向Web页面注入恶意脚本,从而影响用户的安全。本项目"spring boot xss防御"旨在介绍如何在Spring Boot环境中...

    跨站脚本样例

    跨站脚本(Cross-Site Scripting,简称XSS)是一种常见的网络安全漏洞,它发生在Web应用中,允许攻击者在用户浏览器上注入恶意脚本。XSS攻击的主要目的是窃取用户的敏感信息,如Cookie,会话令牌,或者对用户进行...

    防xss攻击和sql注入

    XSS攻击是指攻击者通过在网页中插入恶意脚本,使得用户在浏览页面时,浏览器执行这些脚本,从而获取敏感信息或者对用户的会话进行劫持。XSS攻击主要有三种类型:存储型XSS、反射型XSS和DOM型XSS。为了防范XSS攻击,...

    SpringBoot +esapi 实现防止xss攻击 实战代码,满满干货

    在网络安全领域,XSS(Cross-Site Scripting)攻击是一种常见的威胁,它允许攻击者通过注入恶意脚本到网页上,来劫持用户会话、窃取敏感信息或执行其他恶意操作。SpringBoot是一个流行的Java微服务框架,而ESAPI...

    XSS攻击检测

    XSS(Cross-site scripting)攻击是一种常见的网络安全威胁,它利用了网站对用户输入的不当处理,使得攻击者能够在网页上注入恶意脚本。这些脚本可以在用户的浏览器中执行,从而获取敏感信息、操纵用户界面或者传播...

    java web Xss及sql注入过滤器.zip

    XSS 攻击是通过在网页中插入恶意脚本,当其他用户访问该页面时,这些脚本会被执行,从而窃取用户的敏感信息。为了防止XSS攻击,开发者通常会使用过滤器(Filter)来对HTTP请求中的输入进行清洗和转义,确保数据在...

    XSS HTMLFILTER

    XSS(Cross Site Scripting)攻击是网络安全领域中常见的威胁之一,它允许攻击者通过在网页上注入恶意脚本,从而影响用户浏览器的行为。这些脚本可以窃取用户的Cookie、会话信息,甚至进行钓鱼攻击。为了有效防止XSS...

    跨站语句大全

    跨站脚本攻击,简称XSS,是一种常见的网络安全漏洞,它允许攻击者在用户浏览器中注入恶意脚本。这些脚本可以伪装成用户信任的内容,从而窃取敏感信息、执行操作或者传播恶意软件。XSS攻击主要分为三类:反射型XSS、...

    开发安全培训(XSS攻击&SQL;注入).pdf

    XSS攻击指的是恶意用户将恶意脚本代码注入到网页中,当用户浏览该网页时,这些恶意代码得以执行。XSS攻击可以分为反射型、存储型和DOM型三种。反射型XSS攻击通常发生在服务器直接使用客户端提供的数据,如URL中的...

    扫描sql注入与xss攻击的牛b工具

    在网络安全领域,SQL注入和XSS(跨站脚本)攻击是两种常见的威胁,它们针对的是Web应用程序的安全性。本文将详细介绍这两种攻击类型以及相关的防范措施,并介绍一款名为"扫描SQL注射与XSS攻击的牛B工具"的实用工具,...

    SpringBoot整合XSS.zip

    在现代Web应用开发中,安全问题始终是开发者必须重视的核心环节。SpringBoot作为一个轻量级的Java框架,为快速构建高效、稳定的应用提供了强大的支持。然而,随着Web应用的复杂性增加,各种安全威胁也随之而来,如跨...

    阿里巴巴Java开发手册(嵩山版-2020.8).rar

    手册建议使用安全的编程习惯,如避免硬编码敏感信息,使用预编译SQL防止SQL注入,对用户输入进行过滤和校验,防止跨站脚本攻击等。 五、MySQL数据库 在数据库规约方面,手册给出了关于SQL语句编写、索引优化、事务...

Global site tag (gtag.js) - Google Analytics