如何正确防御xss攻击防御 java

题目导入模板_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
题目导入模板
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩1页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢CWE-80: Improper Neutralization of Script-Related HTML Tags in a Web Page (Basic XSS) (2.11)
CWE-80: Improper Neutralization of Script-Related HTML Tags in a Web Page (Basic XSS)Weakness ID: 80 Abstraction: VariantStatus: Incomplete
Presentation Filter:
High Level
Mapping-Friendly
The software receives input from an upstream component, but it does not neutralize or incorrectly neutralizes special characters such as "&", "&", and "&" that could be interpreted as web-scripting elements when they are sent to a downstream component that processes web pages.
This may allow such characters to be treated as control characters, which are executed client-side in the context of the user's session. Although this can be classified as an injection problem, the more pertinent issue is the improper conversion of such special characters to respective context-appropriate entities before displaying them to the user.
ScopeEffect
ConfidentialityIntegrityAvailability Read application
Execute unauthorized code or
High to Very HighIn the following example, a guestbook comment isn't properly
encoded, filtered, or otherwise neutralized for script-related tags before
being displayed in a client browser.&% for (Iterator i = guestbook.iterator(); i.hasNext(); )
Entry e = (Entry) i.next(); %&
&p&Entry #&%= e.getId()
&p&&%= e.getText()
ReferenceDescription
XSS in parameter in a
XSS in web-based email product via attachment
filenames.
HTML injection in posted
XSS not quoted in error
Carefully check each input parameter against a rigorous positive
specification (whitelist) defining the specific characters and format
allowed. All input should be neutralized, not just parameters that the
user is supposed to specify, but all data in the request, including
hidden fields, cookies, headers, the URL itself, and so forth. A common
mistake that leads to continuing XSS vulnerabilities is to validate only
fields that are expected to be redisplayed by the site. We often
encounter data from the request that is reflected by the application
server or the application that the development team did not anticipate.
Also, a field that is not currently reflected may be used by a future
developer. Therefore, validating ALL parts of the HTTP request is
recommended.
Use and specify an output encoding that can be handled by the
downstream component that is reading the output. Common encodings
include ISO-8859-1, UTF-7, and UTF-8. When an encoding is not specified,
a downstream component may choose a different encoding, either by
assuming a default encoding or automatically inferring which encoding is
being used, which can be erroneous. When the encodings are inconsistent,
the downstream component might treat some character or byte sequences as
special, even if they are not special in the original encoding.
Attackers might then be able to exploit this discrepancy and conduct
they even might be able to bypass protection
mechanisms that assume the original encoding is also being used by the
downstream component. The problem of inconsistent output encodings often arises in web
pages. If an encoding is not specified in an HTTP header, web browsers
often guess about which encoding is being used. This can open up the
browser to subtle XSS attacks.
With Struts, write all data from form beans with the bean's filter
attribute set to true.
To help mitigate XSS attacks against the user's session cookie, set
the session cookie to be HttpOnly. In browsers that support the HttpOnly
feature (such as more recent versions of Internet Explorer and Firefox),
this attribute can prevent the user's session cookie from being
accessible to malicious client-side scripts that use document.cookie.
This is not a complete solution, since HttpOnly is not supported by all
browsers. More importantly, XMLHTTPRequest and other powerful browser
technologies provide read access to HTTP headers, including the
Set-Cookie header in which the HttpOnly flag is set.
OrdinalityDescription
Primary(where
the weakness exists independent of other weaknesses)
NatureTypeIDNameView(s) this relationship pertains to
ChildOfWeakness Base79Development Concepts (primary)699Research Concepts (primary)1000ChildOfCategory990Software Fault Pattern (SFP) Clusters (primary)888
MemberOfView630Weaknesses Examined by SAMATE (primary)630
ExplicitMapped Taxonomy NameNode IDFitMapped Node Name
PLOVERBasic XSS
Software Fault PatternsSFP24Tainted input to command
CAPEC-IDAttack Pattern Name(CAPEC Version: 2.10)
XSS Targeting Non-Script Elements
PHP Remote File Inclusion
XSS Through HTTP Query Strings
XSS Through HTTP Headers
A weakness where the code path has:
1. start statement that accepts input from HTML page
2. end statement that publishes a data item to HTML where
a. the input is part of the data item and
b. the input contains XSS syntax
SubmissionsSubmission DateSubmitterOrganizationSourcePLOVERExternally MinedModificationsModification DateModifierOrganizationSourceSean EidemillerCigitalExternaladded/updated demonstrative
examplesEric DalciCigitalExternalupdated Time_of_IntroductionKDM AnalyticsExternaladded/updated white box definitionsCWE Content TeamMITREInternalupdated Relationships, Taxonomy_Mappings,
Weakness_OrdinalitiesCWE Content TeamMITREInternalupdated DescriptionCWE Content TeamMITREInternalupdated Demonstrative_Examples, Description,
NameKDM AnalyticsExternalImproved the White_Box_DefinitionCWE Content TeamMITREInternalupdated White_Box_DefinitionsCWE Content TeamMITREInternalupdated Demonstrative_Examples, Description, Name,
Potential_MitigationsCWE Content TeamMITREInternalupdated Description,
Potential_MitigationsCWE Content TeamMITREInternalupdated Common_ConsequencesCWE Content TeamMITREInternalupdated Related_Attack_Patterns,
RelationshipsCWE Content TeamMITREInternalupdated Potential_MitigationsCWE Content TeamMITREInternalupdated Relationships,
Taxonomy_MappingsCWE Content TeamMITREInternalupdated Potential_Mitigations, Related_Attack_PatternsPrevious Entry NamesChange DatePrevious Entry
XSSFailure to Sanitize
Script-Related HTML Tags in a Web Page (Basic XSS)Improper Sanitization of
Script-Related HTML Tags in a Web Page (Basic XSS)
More information is available & Please select a different filter.如 何 正 确 防 御 xss 攻 击
作者:红黑联盟
分类 : 比特网
  XSS:Cross Script,本来简写是,但为了区别样式表的css,因此在领域叫做“XSS”。
  XSS攻击通常是指通过"HTML注入"篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户的一种攻击。
  一、HttpOnly防止劫取Cookie
  HttpOnly最早由提出,至今已经成为一个标准。浏览器将禁止页面的Javascript访问带有HttpOnly属性的Cookie。目前主流浏览器都支持,HttpOnly解决是XSS后的Cookie支持攻击。
  我们来看下有没有使用。
  未登录时的Cookie信息
  可以看到,所有Cookie都没有设置HttpOnly,现在我登录下
  发现在个叫BDUSS的Cookie设置了HttpOnly。可以猜测此Cookie用于认证。
  下面我用PHP来实现下:
  Php代码
  header("Set-Cookie: cookie1=test1;");
  header("Set-Cookie: cookie2=test2;httponly",false);
  setcookie('cookie3','test3',NULL,NULL,NULL,NULL,false);
  setcookie('cookie4','test4',NULL,NULL,NULL,NULL,true);
  alert(document.cookie);
  js只能读到没有HttpOnly标识的Cookie
  二、输入检查
  输入检查一般是检查用户输入的中是否包含一些特殊字符,如&、&、'、"等,如果发现存在特殊字符,则将这些字符过滤或者编码。
  例如网站注册经常用户名只允许字母和数字的组合,或者邮箱电话,我们会在前端用js进行检查,但在端代码必须再次检查一次,因为客户端的检查很容易绕过。
  网上有许多开源的“XSS Filter”的实现,但是它们应该选择性的使用,因为它们对特殊字符的过滤可能并非数据的本意。比如一款php的lib_filter类:
  Php代码
  $filter = new lib_filter();
  echo $filter-&go('1+1&1');
  它输出的是1,这大大歪曲了数据的语义,因此什么情况应该对哪些字符进行过滤应该适情况而定。
  三、输出检查
  大多人都知道输入需要做检查,但却忽略了输出检查。
  1、在HTML标签中输出
  如代码:
  Php代码
  $a = "alert(1);";
  $b = "";
  这样客户端受到xss攻击,解决方法就是对变量使用htmlEncode,php中的函数是htmlentities
  Php代码
  $a = "alert(1);";
  $b = "";
  2、在HTML属性中输出
  Html代码
  这种情况防御也是使用htmlEncode
  在owasp-php中实现:
  Php代码
  $immune_htmlattr = array(',', '.', '-', '_');
  $this-&htmlEntityCodec-&encode($this-&immune_htmlattr, "\"&123123;&\"");
  这样xss又生效了。首先js变量输出一定要在引号内,但是如果我$c = "\"alert(123);//",你会发现放引号中都没用,自带的函数都不能很好的满足。这时只能使用一个更加严格的JavascriptEncode函数来保证安全——除数字、字母外的所有字符,都使用十六进制"\xHH"的方式进行编码。这里我采用开源的owasp-php方法来实现
  Php代码
  $c = "1;alert(3)";
  var c = ;
  最后输出\x22abc\x3Balert\x2B\x2F\x2F
  4、在事件中输出
  Html代码
  可能攻击方法
  Html代码
  这个其实就是写在中,所以跟3防御相同
  5、在css中输出
  在owasp-php中实现:
  Php代码
  $immune = array("");
  $this-&cssCodec-&encode($immune, 'background:expression(window.x?0:(alert(/XSS/),window.x=1));');
  6、在地址中输出
  先确保变量是否是"http"开头,然后再使用js的encodeURI或encodeURIComponent方法。
  在owasp-php中实现:
  Php代码
  $instance = ESAPI::getEncoder();
  $instance-&encodeForURL(‘url’);
  四、处理富文体
  就像我写这篇博客,我几乎可以随意输入任意字符,插入图片,插入代码,还可以设置样式。这个时要做的就是设置好白名单,严格控制标签。能自定义 css件麻烦事,因此最好使用成熟的开源框架来检查。php可以使用htmlpurify
  五、防御DOM Based XSS
  DOM Based XSS是从javascript中输出数据到HTML页面里。
  Js代码
[ 责任编辑:小石潭记 ]
比特网 18:18:30
互联网创业者迎来春天,创业环境将更好
“互联网+”接上大市场,小创业正确打开方式
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。安全代码审查.跨站点脚本攻击(XSS)
我的图书馆
安全代码审查.跨站点脚本攻击(XSS)
安全代码审查.跨站点脚本攻击(XSS)
只要代码在返回客户端的 HTML 输出流中使用输入参数,就很容易受到跨站点脚本(XSS,也称 CSS)攻击。即使在进行代码审查之前,您也可以运行一个简单的测试,来检查应用程序是否存在 XSS 缺陷。搜索那些将用户输入信息发送回浏览器的页。
XSS 错误是在用户输入的数据中保持太多信任的一个例子。例如,应用程序可能期望用户输入一个定价,但是攻击者会在定价之外包含一些 HTML 和 JavaScript 代码。所以,您应该总是确保对来自不可信来源的数据进行验证。在审查代码时,总是询问这样的问题:“这个数据进行验证了吗?”在 ASP.NET 应用程序中保存所有入口点(如 HTTP 头、查询字符串、窗体数据等等)的列表,并确保所有输入都会在某点受到有效性检查。不要测试输入值是否不正确,因为这种方法认为您会留意所有存在潜在危险的输入。ASP.NET 应用程序中最常见的检查数据有效性的方式是使用正则表达式。
您可以通过在窗体字段中键入一些文字(如“XYZ”)并测试输出,来进行简单的测试。如果浏览器显示“XYZ”或者如果查看 HTML 源文件时看到的是“XYZ”,那么您的 Web 应用程序将很容易受到 XSS 攻击。如果您需要看到更动态的内容,需要注入 &script&alert('hello');&/script&。这种技术可能无法在所有情况下都适用,因为它取决于如何使用输入来生成输出。以下过程有助于识别常见的 XSS 缺陷:
标识输出输入的代码。
标识有可能存在危险的 HTML 标记和属性。
标识处理 URL 的代码。
检查输出是否编码。
检查字符编码是否正确。
检查 validateRequest 属性。
检查HttpOnly cookie 选项。
检查 &frame& 安全属性。
检查是否使用 innerText 和 innerHTML 属性。
标识输出输入的代码
从浏览器查看页输出的源代码,看是否您的代码位于一个属性中。如果确实如此,注入以下代码并重新测试,以查看输出。
"onmouseover= alert('hello');"
开发人员常用的一个技术是筛选 & and & 字符。如果所审查的代码筛选了这些字符,那么可以改用以下代码测试:
&{alert('hello');}
如果代码不筛选这些字符,那么可以通过使用以下脚本测试代码:
&script&alert(document.cookie);&/script&;
在使用这个脚本之前可能必须要添加一个结束标记,如下所示。
"&&/a&&script&alert(document.cookie);&/script&
搜索“.Write”
在 .aspx 源代码和任何其他为应用程序开发的程序集包含的代码中搜索“.Write”字符串。这将定位所有出现的 Response.Write,以及任何可能通过响应对象变量生成输出的内部例程,如下面所示的代码。
public void WriteOutput(Response respObj)
respObj.Write(Request.Form["someField"]);
您还应该在 .aspx 源代码中搜索 “&%=”字符串,这也可以用来写输出,如下所示:
&%=myVariable %&
下表列出了一些常见的结合使用输入字段和 Response.Write 的情况。
Response.Write(name.Text); Response.Write(Request.Form["name"]);
查询字符串
Response.Write(Request.QueryString["name"]);
Response.Write(
Request.Cookies["name"].Values["name"]);
会话变量和应用程序变量
Response.Write(Session["name"]); Response.Write(Application["name"]);
数据库和数据存储区
SqlDataReader reader = cmd.ExecuteReader();Response.Write(reader.GetString(1));
标识有可能存在危险的 HTML 标记和属性
虽然并不全面,但是以下常用的 HTML 标记可能使恶意用户可注入脚本代码:
&frameset&
HTML 属性(如 src、lowsrc、style 和 href)可以与以上的标记结合使用,导致 XSS 攻击。
例如,&img& 标记的 src 属性可能是注入的来源,如下例中所示。
&IMG SRC="javascript:alert('hello');"&
&IMG SRC="java
script:alert('hello');"&
&IMG SRC="java
script:alert('hello');"&
&style& 标记还能通过改变 MIME 类型,成为注入的来源,如下所示。
&style TYPE="text/javascript"&
alert('hello');
检查是否您的代码试图通过筛选掉一些已知的危险字符来净化输入。不要依赖此方法,因为恶意用户一般可找到替代的表示方法绕过验证。相反,您的代码应该对已知安全的输入进行验证。下表列出了表示一些常用字符的若干方式:
"(双引号)
'(单引号)
&(小于号)
&(大于号)
标识处理 URL 的代码
处理 URL 的代码可能存在缺陷。审查代码,看看是否容易受到以下常见攻击:
如果您的 Web 服务器没有使用最新的安全修补程序更新,它可能遭到目录遍历和双斜杠攻击,如:
/..%255%../winnt
/..%255%..//somedirectory
如果您的代码筛选了“/”,攻击者可通过使用同一字符的替代表示形式,很容易地绕过筛选器。例如,“/”的超长 UTF?C8 表示形式是“%c0f%af”,可以用在以下 URL 中:
/..%c0f%af../winnt
如果您的代码处理查询字符串输入,应该检查它是否对输入数据进行了限制并执行了边界检查。检查如果攻击者通过查询字符串参数传递非常多的数据,代码是否不易受到攻击。
/test.aspx?var=InjectHugeAmountOfDataHere
检查输出是否编码
您应该检查是否使用 HtmlEncode 对包含所有类型输入的 HTML 输出进行了编码,虽然这不能替代对输入是否正确和输入的格式是否规范的检查。还要检查是否使用了 UrlEncode 来编码 URL 字符串。输入数据可能来自查询字符串、窗体字段、cookie、HTTP 头和从数据库中读取的输入,尤其是在与其他应用程序共享数据库时。通过对数据进行编码,可以防止浏览器将 HTML 视为可执行脚本。
检查字符编码是否正确
为了帮助防止攻击者使用规范化和多字节转义序列欺骗输入验证例程,应该检查字符编码是否已经正确设置以限制表示输入的方式。
检查应用程序的 Web.config 文件是否已经设置由 &globalization& 元素配置的 requestEncoding 和 responseEncoding 属性,如下所示。
&configuration&
&system.web&
&globalization
requestEncoding="ISO-8859-1"
responseEncoding="ISO-8859-1"/&
&/system.web&
&/configuration&
字符编码还可以使用 &meta& 标记或者 ResponseEncoding 页级属性在页级设置,如下所示。
&% @ Page ResponseEncoding="ISO-8859-1" %&
有关更多信息,请参阅“”单元。
检查 validateRequest 属性
使用 .NET Framework 1.1 版构建的 Web 应用程序执行输入筛选,以消除潜在的恶意输入,如嵌入脚本。但不要依赖这一点,应该使用它作为纵深防范措施。检查配置文件中的 &pages& 元素,确认 validateRequest 属性是否已经设置为 true。这还可以设置为页级属性。扫描 .aspx 源文件中的 validateRequest,检查它没有为任何页设置为 false。
检查 HttpOnly cookie 选项
Internet Explorer 6 SP 1 支持一个新的 HttpOnly cookie 属性,可以防止客户端脚本从 document.cookie 属性访问 cookie。这样返回的将是一个空的字符串。无论何时用户浏览到当前域中的 Web 站点,仍然发送 cookie 到服务器。有关更多信息,请参阅“”单元中的“跨站点脚本攻击”部分。
检查 安全属性
Internet Explorer 6 和更高版本支持 &frame& 和 &iframe& 元素的一个新属性 security。您可以使用 security 属性将用户的受限站点 Internet Explorer 安全区域设置应用于单独的 frame 或者 iframe。有关更多信息,请参阅“”单元中的“跨站点脚本攻击”部分。
检查是否使用 innerText 和 innerHTML 属性
如果您创建了一个带有不可信输入的页,应该验证是否使用了 innerText 属性而非 innerHTML。innerText 属性可安全呈现内容并确保不会执行脚本。
| 浏览(201) | &(0)
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&
喜欢该文的人也喜欢当前位置:&>&&>&
如何设置安全的header
发布时间:
来源:服务器之家
0×00 背景
在统计了Alexa top 100万网站的header安全分析之后(2012年11月 C 2013年3月 C
2013年11月),我们发现其实如何正确的设置一个header并不是一件容易的事情。尽管有数不胜数的网站会使用大量有关安全方面的header,但并没有一个像样的平台能够为开发者们提供必要的信息,以辨别那些常见的错误设置。或者说,即使这些安全方面的header设置正确了,也没有一个平台能够为开发者提供一个系统的测试方法,用来测试正确与否。这些header如果设置错误了不仅会产生安全的假象,甚至会对网站的安全产生威胁。veracode认为安全性header是网络防护中非常重要的一环,并且他希望让开发者们能够简捷、正确地设置站点。如果您对某一header或设置有任何疑问,我们有极好的资源能够追踪到浏览器支持情况。
0×01 细节
1. X-XSS-Protection
这个header主要是用来防止浏览器中的反射性xss。现在,只有IE,chrome和safari(webkit)支持这个header。
正确的设置
0&C&关闭对浏览器的xss防护
1&C&开启xss防护
1;&mode=block&C&开启xss防护并通知浏览器阻止而不是过滤用户注入的脚本。
1;&report=/report&C&这个只有chrome和webkit内核的浏览器支持,这种模式告诉浏览器当
发现疑似xss攻击的时候就将这部分数据post到指定地址。
0 C 关闭对浏览器的xss防护&&
1 C 开启xss防护&&
1; mode=block C 开启xss防护并通知浏览器阻止而不是过滤用户注入的脚本。&&
1; report=/report C
这个只有chrome和webkit内核的浏览器支持,这种模式告诉浏览器当
发现疑似xss攻击的时候就将这部分数据post到指定地址。&&
通常不正确的设置
0;&mode=&C&记住当配置为0的时候,即使加了mode=block选项也是没有效果的。需要指出的是,chrome
在发现这种错误的配置后还是会开启xss防护。
1&mode=&C&数字和选项之间必须是用分号分割,逗号和空格都是错误的。但是这种错误配置情况下,
IE和chrome还是默认会清洗xss攻击,但是不会阻拦。
0; mode= C
记住当配置为0的时候,即使加了mode=block选项也是没有效果的。需要指出的是,chrome
在发现这种错误的配置后还是会开启xss防护。&&
1 mode= C 数字和选项之间必须是用分号分割,逗号和空格都是错误的。但是这种错误配置情况下,
IE和chrome还是默认会清洗xss攻击,但是不会阻拦。
如果过滤器检测或阻拦了一个反射性xss以后,IE会弹出一个对话框。当设置为1时,chrome会隐藏对反射性xss的输出。如果是设置为
1; mode=block ,那么chrome会直接将user-agent置为一个空值:, URL &这种形式。
Post from Microsoft on the X-XSS-Protection Header
Chromium X-XSS-Protection Header Parsing Source
Discussion of report format in WebKit bugzilla
2. X-Content-Type-Options
这个header主要用来防止在IE9、chrome和safari中的MIME类型混淆攻击。firefox目前对此还存在争议。通常浏览器可以通过嗅探内容本身的方法来决定它是什么类型,而不是看响应中的content-type值。通过设置
X-Content-Type-Options:如果content-type和期望的类型匹配,则不需要嗅探,只能从外部加载确定类型的资源。举个例子,如果加载了一个样式表,那么资源的MIME类型只能是text/css,对于IE中的脚本资源,以下的内容类型是有效的:
application/ecmascript
application/javascript
application/x-javascript
text/ecmascript
text/javascript
text/jscript
text/x-javascript
text/vbscript
application/ecmascript&&
application/javascript&&
application/x-javascript&&
text/ecmascript&&
text/javascript&&
text/jscript&&
text/x-javascript&&
text/vbs&&
text/vbscript&&
对于chrome,则支持下面的MIME 类型:
text/javascript
text/ecmascript
application/javascript
application/ecmascript
application/x-javascript
text/javascript1.1
text/javascript1.2
text/javascript1.3
text/jscript
text/live&script
text/javascript&&
text/ecmascript&&
application/javascript&&
application/ecmascript&&
application/x-javascript&&
text/javascript1.1&&
text/javascript1.2&&
text/javascript1.3&&
text/jscript&&
text/live script
正确的设置
nosniff&C&这个是唯一正确的设置,必须这样。
nosniff C 这个是唯一正确的设置,必须这样。&&
通常不正确的设置
‘nosniff’&C&引号是不允许的
:&nosniff&C&冒号也是错误的
‘nosniff’ C 引号是不允许的&&
: nosniff C 冒号也是错误的&
在IE和chrome中打开开发者工具,在控制台中观察配置了nosniff和没有配置nosniff的输出有啥区别。
Microsoft Post on Reducing MIME type security risks
Chromium Source for parsing nosniff from response
Chromium Source list of JS MIME types
MIME Sniffing Living Standard
3. X-Frame-Options
这个header主要用来配置哪些网站可以通过frame来加载资源。它主要是用来防止UI redressing
补偿样式攻击。IE8和firefox
18以后的版本都开始支持ALLOW-FROM。chrome和safari都不支持ALLOW-FROM,但是WebKit已经在研究这个了。
正确的设置
DENY&C&禁止所有的资源(本地或远程)试图通过frame来加载其他也支持X-Frame-Options&的资源。
SAMEORIGIN&C&只允许遵守同源策略的资源(和站点同源)通过frame加载那些受保护的资源。
ALLOW-FROM&&C&允许指定的资源(必须带上协议http或者https)通过frame来加
载受保护的资源。这个配置只在IE和firefox下面有效。其他浏览器则默认允许任何源的资源
(在X-Frame-Options没设置的情况下)。
DENY C 禁止所有的资源(本地或远程)试图通过frame来加载其他也支持X-Frame-Options
的资源。&&
SAMEORIGIN C
只允许遵守同源策略的资源(和站点同源)通过frame加载那些受保护的资源。&&
ALLOW-FROM
允许指定的资源(必须带上协议http或者https)通过frame来加
载受保护的资源。这个配置只在IE和firefox下面有效。其他浏览器则默认允许任何源的资源
(在X-Frame-Options没设置的情况下)。
通常不正确的设置
ALLOW&FROM&&C&ALLOW和FROM&之间只能通过连字符来连接,空格是错误的。
ALLOW-FROM&&C&ALLOW-FROM选项后面必须跟上一个URI而且要有明确的协议(http或者https)
ALLOW FROM
C ALLOW和FROM
之间只能通过连字符来连接,空格是错误的。&&
ALLOW-FROM选项后面必须跟上一个URI而且要有明确的协议(http或者https)&&
可以通过访问test cases 来查看各种各样的选项 和浏览器对这些frame中的资源的响应。
X-Frame-Options RFC
Combating ClickJacking With X-Frame-Options
4. Strict-Transport-Security
Strict Transport Security (STS)
是用来配置浏览器和服务器之间安全的通信。它主要是用来防止中间人攻击,因为它强制所有的通信都走TLS。目前IE还不支持
STS头。需要注意的是,在普通的http请求中配置STS是没有作用的,因为攻击者很容易就能更改这些值。为了防止这样的现象发生,很多浏览器内置了一个配置了STS的站点list。
正确的设置
注意下面的值必须在https中才有效,如果是在http中配置会没有效果。
max-age=&C&告诉浏览器将域名缓存到STS&list里面,时间是一年。
max-age=;&includeSubDomains&C&告诉浏览器将域名缓存到STS&list里面并且包含所有的子域名,
时间是一年。
max-age=0&C&告诉浏览器移除在STS缓存里的域名,或者不保存此域名。
max-age= C 告诉浏览器将域名缓存到STS list里面,时间是一年。&&
max-age=; includeSubDomains C 告诉浏览器将域名缓存到STS
list里面并且包含所有的子域名,
时间是一年。&&
max-age=0 C 告诉浏览器移除在STS缓存里的域名,或者不保存此域名。&&
通常不正确的设置
直接将includeSubDomains设置为&&,但是用户依然可以通过&
来访问此站点。如果&并没有跳转到&&并设置&STS&header,那么访问
&就会直接被浏览器重定向到&&。
max-age=60&C&这个只设置域名保存时间为60秒。这个时间太短了,可能并不能很好的保护用户,
可以尝试先通过http来访问站点,这样可以缩短传输时间。
max-age=&includeSubDomains&C&max-age&和&includeSubDomains&直接必须用分号分割。
这种情况下,即使max-age的值设置的没有问题,chrome也不会将此站点保存到STS缓存中。
max-age=,&includeSubDomains&C&同上面情况一样。
max-age=0&C&尽管这样在技术上是没有问题的,但是很多站点可能在处理起来会出差错,
因为0可能意味着永远不过期。
直接将includeSubDomains设置为
,但是用户依然可以通过
来访问此站点。如果 并没有跳转到
并设置 STS
header,那么访问
就会直接被浏览器重定向到
max-age=60 C 这个只设置域名保存时间为60秒。这个时间太短了,可能并不能很好的保护用户,
可以尝试先通过http来访问站点,这样可以缩短传输时间。&&
max-age= includeSubDomains C max-age 和 includeSubDomains
直接必须用分号分割。
这种情况下,即使max-age的值设置的没有问题,chrome也不会将此站点保存到STS缓存中。&&
max-age=, includeSubDomains C 同上面情况一样。&&
max-age=0 C 尽管这样在技术上是没有问题的,但是很多站点可能在处理起来会出差错,
因为0可能意味着永远不过期。
判断一个主机是否在你的STS缓存中,chrome可以通过访问chrome://net-internals/#hsts,首先,通过域名请求选项来确认此域名是否在你的STS缓存中。然后,通过https访问这个网站,尝试再次请求返回的STS头,来决定是否添加正确。
Strict Transport Security RFC6797
Wikipedia page on Strict Transport Security (with examples)
5. Public-Key-Pins (起草中)
有关这个header的详细描述还在起草中,但是它已经有了很清晰的安全作用,所以我还是把它放在了这个list里面。Public-Key-Pins
(PKP)的目的主要是允许网站经营者提供一个哈希过的公共密钥存储在用户的浏览器缓存里。跟Strict-Transport-Security功能相似的是,它能保护用户免遭中间人攻击。这个header可能包含多层的哈希运算,比如pin-sha256=base64(sha256(SPKI)),具体是先将
X.509 证书下的Subject Public Key Info (SPKI)
做sha256哈希运算,然后再做base64编码。然而,这些规定有可能更改,例如有人指出,在引号中封装哈希是无效的,而且在33版本的chrome中也不会保存pkp的哈希到缓存中。
这个header和
STS的作用很像,因为它规定了最大子域名的数量。此外,pkp还提供了一个Public-Key-Pins-Report-Only
头用来报告异常,但是不会强制阻塞证书信息。当然,这些chrome都是不支持的。
正确的设置
max-age=3000;&pin-sha256=”d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=”;&C
规定此站点有3000秒的时间来对x.509证书项目中的公共密钥信息(引号里面的内容)
做sha256哈希运算再做base64编码。
max-age=3000;&pin-sha256=”d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=”;
&report-uri=”/pkp-report”&C&同上面一样,区别是可以报告异常。
max-age=3000;
pin-sha256=”d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=”; C
规定此站点有3000秒的时间来对x.509证书项目中的公共密钥信息(引号里面的内容)
做sha256哈希运算再做base64编码。&&
max-age=3000;
pin-sha256=”d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=”;
report-uri=”/pkp-report” C
同上面一样,区别是可以报告异常。&&
通常不正确的设置
max-age=3000;&pin-sha256=d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=;&C
Not&encapsulating&the&hash&value&in&quotes&leads&to&Chrome&33&not&adding
the&keys&to&the&PKP&cache.&This&mistake&was&observed&in&all&but&one&of&the
&four&sites&that&returned&this&or&the&report-only&header&response.没有添加引号,
这样的话chrome不会将这个key添加到PKP缓存中。我们的调查中发现有四分之一的网站存在此问题。
max-age=3000;
pin-sha256=d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=; C
Not encapsulating the hash value in quotes leads to Chrome 33
not adding
the keys to the PKP cache. This mistake was observed in all but
one of the
four sites that returned this or the report-only header
response.没有添加引号,
这样的话chrome不会将这个key添加到PKP缓存中。我们的调查中发现有四分之一的网站存在此问题。
如果站点成功的将pkp哈希存入了客户端缓存,那么使用和Strict-Transport-Security
(STS)相同的方法查看pubkey_hashes 信息就可以了。
Public-Key-Pins draft specification
Chrome issue tracking the implementation of Public-Key-Pins
Chromium source code for processing Public-Key-Pins header
6. Access-Control-Allow-Origin
Access-Control-Allow-Origin是从Cross Origin Resource Sharing
(CORS)中分离出来的。这个header是决定哪些网站可以访问资源,通过定义一个通配符来决定是单一的网站还是所有网站可以访问我们的资源。需要注意的是,如果定义了通配符,那么
Access-Control-Allow-Credentials选项就无效了,而且user-agent的cookies不会在请求里发送。
正确的设置
*&C&通配符允许任何远程资源来访问含有Access-Control-Allow-Origin&的内容。
&C&只允许特定站点才能访问(http://[host],&或者&https://[host])
* C 通配符允许任何远程资源来访问含有Access-Control-Allow-Origin
的内容。&&
C 只允许特定站点才能访问(http://[host], 或者
https://[host])
通常不正确的设置
,&&C&多个站点是不支持的,只能配置一个站点。
*.&C&只允许单一的站点
http://*.&C&同上面一样
多个站点是不支持的,只能配置一个站点。&&
*. C 只允许单一的站点&&
http://*. C 同上面一样 &
很容易就能确定这个header是否被设置的正确,因为如果设置错误的话,CORS请求就会接收不到数据。
Copyright © . 版权所有

我要回帖

更多关于 xss攻击防御 的文章

 

随机推荐