因收到Google相关通知,网站将会择期关闭。相关通知内容 05 CSRF:为什么用户的操作他自己不承认? 你好,我是王昊天。 想象你是个青春阳光的精神小伙,和女神小美青梅竹马,培养了十几年的感情。眼看着就要抱得美人归时,半路杀出了个男二号,成了你的竞争对手。有一天你们恰好在一起聚会,男二号趁你上厕所,用你的手机给小美发了微信。 “小美,你闺蜜真好看,可以介绍给我吗?” 你回来时,小美大骂了你一通,然后生气地摔门而去。 在这个故事里,男二就通过他的行为完成了一次CSRF。 CSRF CSRF的全名是Cross-Site Request Forgery,中文名称是跨站点请求伪造,简单来说,就是让Web应用程序不能有效地分辨一个外部的请求,是否真正来自发起请求的用户,虽然这个请求可能是构造完整、并且输入合法的。 和前几节课程中学习过的漏洞相比,CSRF有自己的漏洞名称,明显是一个更为细分的漏洞类型,而非一个漏洞类别。它作为一个独立的细分漏洞类型,值得我们单独进行探讨,说明影响力是足够大的。 扩展开讲一讲,当一个Web应用在设计过程中没有充分考虑来自客户端请求的验证机制时,就可能会遇到CSRF问题。站在攻击者的视角来看,他可以通过一个URL、图片加载或者XMLHttpRequest等方式,让用户触发一个自动化请求发送行为,这个请求在Web Server接受时会被认为是合法的。 接下来我们看一个典型的攻击场景。 如下HTML目的是让用户更新自己的信息:
其中的profile.php包含如下代码: // initial the seesion in order to validate sessions session_start(); // if the session is registered a valid user the allow update if ( !session_is_registered("username") ) { echo "invalid session detected!"; // Redirect user to login page ... exit; } // The user session is valid, so process the request // and update the information update_profile(); 这里的PHP代码中是包含了一些保护措施的,结合我们前面几节课程学到的内容来看,它包含了用户身份的有效性认证,阻止了越权访问。但是上述代码并不能够有效地防止CSRF攻击,如果攻击者可以构建下面这段代码,并且将它托管到某个站点,那么当用户保持登录状态并且访问攻击代码页面时,就会触发攻击代码: