这段代码使用的是iframe标签,用户打开这个网站的时候,也同时会加载下面的两个网站,而且用户还看不见,这样就让用户自动转发了,然后用户的列表好友看到链接说不定也会点进去,这样就导致这个蠕虫在微博中传播。
以上的果树可以知道,CSRF攻击是黑客借助受害者的Cookie骗取到服务器的信任,黑客获取不到Cookie,也看不到Cookie,也因为浏览器的同源策略,黑客无法获得任何东西,CSRF能做的就是给服务器发送请求。
CSRF攻击场景(POST)上面使用的是GET提交请求,即直接使用的是URL,Java中的Servlet和PHP都可以自己选择只接收哪种请求。
所以导致有时候GET请求的攻击无法被执行,但是仍然有POST请求的CSRF攻击存在。
POST请求只有一下的报文服务器才能接收:
如下是使用post提交的post.html代码:
解释一下: 使用的form表单,type是hidden,就是用户不可见,然后方法是post提交,最后使用js代码实现自动提交,这样用户知道打开URL,就直接进行转发,而且这样,URL就具有很强的隐蔽性。
放入jsp代码中进行测试:
这里面中,只接收POST请求,访问html页面时,就会跳转:
为了让其不跳转,有更好的隐蔽性,可以用form表单中的target来解决这个问题,用target来隐藏跳转;https://www.runoob.com/tags/att-form-target.html
target 属性规定一个名称或一个关键词,指示在何处打开 action URL,即在何处显示提交表单后接收到的响应。
target 属性定义浏览器上下文(比如选项卡、窗口或内联框架)的名称或关键词。
我们执行的ifame代码打开页面之后被隐藏,就上面都看不见了,然后黑客自己写点东西伪造一下,就是完美的攻击过程
CSRF的预防比较简单,加一些小操作就可以了
二次确认比如黑客用CSRF让你转账,但是这个时候提示你——是否转账?,或者让你输入验证码什么的,提醒你的误操作,就可以有效防止CSRF。
Token认证Token是标志、记号的意思,在IT领域也叫令牌
Token类似于验证码,但是这种验证码不需要用户输入
传统验证码思路是生成验证字符串保存在Session中,然后再客户端生成一个验证图片,只要这个图片和服务器里面的session对应,就通过验证。
Token是一个不要输入的验证码,当用户进入某些页面的时候,服务器会随机生成一段字符串分给用户,存储再session中,当用户进入某些页面时,就直接传递到Cookie上去了。如果在html中,一般会隐藏起来,如;
<input type="hidden" name="token" value="8wen23kl23j4b1230fweh8">当用户提交表单操作的时候,就会判断这个value和服务器session存储的value是否一样,如果不一样,就有可能时CSRF攻击 。
有时用户操作不需要提交表单,比如删除一个人的信息:
?userid=2这样的form表单中插入URL就不太合适,此时,通常就会在Token中存储Cookie。
所以使用Token防御CSRF的步骤如下:
当用户登录的时候随机生成一段字符串,存储在session