什么是CSRF?
CSRF又叫“跨站点请求伪造(Cross-Site Request Forgeries,CSRF)”,CSRF攻击是指攻击者通过设置好的陷阱,前置对已完成认证的用户进行非预期的个人信息或者设定信息等某些状态的更新,属于被动攻击。
跨站点请求伪造可能会造成一下影响:
利用已通过认证的用户权限更新设定信息等;
利用已通过认证的用户权限购买商品;
利用已通过认证的用户权限在留言板上发表言论;
Cross-site request forgery 跨站请求伪造,也被称为 “one click attack” 或者 session riding,通常缩写为 CSRF 或者 XSRF,是一种对网站的恶意利用。CSRF 则通过伪装来自受信任用户的请求来利用受信任的网站。
CSRF 攻击类似 XSS 攻击,都是在页面中嵌入特殊部分引诱或强制用户操作从而得到破坏等的目的,区别就是迫使用户 访问特定 URL / 提交表单
还是执行 javascript 代码。
为什么叫“跨站请求”攻击?
从字面意思就可以理解:当你访问fuck.com
黑客页面的时候,页面上放了一个按钮或者一个表单,URL/action 为http://you.com/delete-myself
,这样引导或迫使甚至伪造用户触发按钮或表单。在浏览器发出 GET 或 POST 请求的时候,它会带上 you.com
的 cookie,如果网站没有做 CSRF 防御措施,那么这次请求在 you.com
看来会是完全合法的,这样就会对 you.com
的数据产生破坏。
如何防止CSRF?
CSRF 主流防御方式是在后端生成表单的时候生成一串随机 token ,内置到表单里成为一个字段,同时,将此串 token 置入 session 中。每次表单提交到后端时都会检查这两个值是否一致,以此来判断此次表单提交是否是可信的。提交过一次之后,如果这个页面没有生成 CSRF token ,那么 token 将会被清空,如果有新的需求,那么 token 会被更新。
攻击者可以伪造 POST 表单提交,但是他没有后端生成的内置于表单的 token,session 中有没有 token 都无济于事。
跨站点请求伪造的案例
下面以留言板功能为例,讲解跨站点请求伪造。该功能只允许已认证并登录的用户在留言板上发表内容。
在该留言板系统上,受害者用户A 是已认证状态。它的浏览器中的Cookie 持有已认证的会话 ID(步骤1)。
攻击者设置好一旦用户访问,即会发送在留言板上发表非主观行为产生的评论的请求的陷阱。用户A 的浏览器执行完陷阱中的请求后,留言板上也就会留下那条评论(步骤2)。
触发陷阱之际,如果用户A 尚未通过认证,则无法利用用户A 的身份权限在留言板上发表内容。
Redis简介
Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库,也被称为数据结构服务器。
Redis与其他key-value产品有以下优点:
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用;
Redis不仅仅支持简单的key-value类型的数据,同时还提供list、set、set、hash等数据结构的存储;
Redis支持数据的备份,即master-slave模式的数据备份;
Redis的优势:
性能极高----Redis的读的速度是110000次/秒,写的速度是80000次/秒;
丰富的数据结构----Redis支持二进制案例的Strings、Lists、Hashes、Sets及Ordered Sets数据类型操作;
原子性----Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行;
丰富的特性----Redis还支持publish/subscribe、通知、key过期等等特性;