diff --git a/notes/HTTP.md b/notes/HTTP.md index 76b30b25..c022c154 100644 --- a/notes/HTTP.md +++ b/notes/HTTP.md @@ -42,6 +42,7 @@ * [攻击模式](#攻击模式) * [跨站脚本攻击](#跨站脚本攻击) * [SQL 注入攻击](#sql-注入攻击) + * [跨站点请求伪造](#跨站点请求伪造) * [八、各版本比较](#八各版本比较) * [HTTP/1.0 与 HTTP/1.1 的区别](#http10-与-http11-的区别) * [HTTP/1.1 与 HTTP/2.0 的区别](#http11-与-http20-的区别) @@ -629,6 +630,36 @@ strSQL = "SELECT * FROM users;" - 其他,使用其他更安全的方式连接 SQL 数据库。例如已修正过 SQL 注入问题的数据库连接组件,例如 ASP.NET 的 SqlDataSource 对象或是 LINQ to SQL。 - 使用 SQL 防注入系统。 +## 跨站点请求伪造 + +### 1. 概念 + +(Cross-site request forgery,XSRF),是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行。这利用了 Web 中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。 + +XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。 + +假如一家银行用以执行转账操作的 URL 地址如下:`http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName`。 + +
那么,一个恶意攻击者可以在另一个网站上放置如下代码:``。

+ +如果有账户名为 Alice 的用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会损失 1000 资金。 + +这种恶意的网址可以有很多种形式,藏身于网页中的许多地方。此外,攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛,博客等任何用户生成内容的网站中。这意味着如果服务器端没有合适的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险。 + +透过例子能够看出,攻击者并不能通过 CSRF 攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义执行操作。 + +### 2. 防范手段 + +(一)检查 Referer 字段 + +HTTP 头中有一个 Referer 字段,这个字段用以标明请求来源于哪个地址。在处理敏感数据请求时,通常来说,Referer 字段应和请求的地址位于同一域名下。 + +这种办法简单易行,工作量低,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的 Referer 字段。虽然 HTTP 协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其 Referer 字段的可能。 + +(二)添加校验 Token + +由于 CSRF 的本质在于攻击者欺骗用户去访问自己设置的地址,所以如果要求在访问敏感数据请求时,要求用户浏览器提供不保存在 cookie 中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再执行 CSRF 攻击。这种数据通常是表单中的一个数据项。服务器将其生成并附加在表单中,其内容是一个伪乱数。当客户端通过表单提交请求时,这个伪乱数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪乱数,而通过 CSRF 传来的欺骗性攻击中,攻击者无从事先得知这个伪乱数的值,服务器端就会因为校验 token 的值为空或者错误,拒绝这个可疑请求。 + # 八、各版本比较 ## HTTP/1.0 与 HTTP/1.1 的区别 @@ -665,3 +696,4 @@ HTTP/1.1 的解析是基于文本的,而 HTTP/2.0 采用二进制格式。 - [MDN : HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP) - [维基百科:跨站脚本](https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%B6%B2%E7%AB%99%E6%8C%87%E4%BB%A4%E7%A2%BC) - [维基百科:SQL 注入攻击](https://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A) +- [维基百科:跨站点请求伪造](https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0) diff --git a/notes/分布式问题分析.md b/notes/分布式问题分析.md index 193d9a8b..228d3fb6 100644 --- a/notes/分布式问题分析.md +++ b/notes/分布式问题分析.md @@ -345,8 +345,9 @@ Terracotta 的基本原理是对于集群间共享的数据,当在一个节点 ## ID 唯一性 -- 使用全局唯一 ID:GUID; +- 使用全局唯一 ID:GUID。 - 为每个分片指定一个 ID 范围。 +- 分布式 ID 生成器 (如 Twitter 的 [Snowflake](https://twitter.github.io/twitter-server/) 算法)。 # 参考资料