我和我的朋友喝啤酒.
来自维基百科:
在所有表单提交和副作用URL中要求使用特定于用户的秘密令牌可防止CSRF; 攻击者的网站无法在其提交的内容中加入正确的令牌
atacker可以间接使用浏览器cookie,但他不能直接使用它们!这就是为什么他不能使用cookie将cookie放入链接document.write()
让我们看一下如何生成注销链接.这是安全的方式吗?这个GET请求可以伪造吗?
function logout(){
echo '<a href="?action=logout&sid='.htmlspecialchars($_COOKIE['sid']).'>Logout</a>';
}
Run Code Online (Sandbox Code Playgroud)
sid是为每个会话生成的会话ID
在服务器端,执行以下检查:
$_GET['sid']==$_COOKIE['sid']
Run Code Online (Sandbox Code Playgroud)
绝对不!切勿使用会话标识符进行 CSRF 保护。
至于为什么?嗯,答案很简单。这样做为会话劫持攻击打开了大门。想象一下,有人出于某种原因将链接复制并粘贴到电子邮件或网络上。现在,电子邮件另一端的人拥有该会话的会话标识符。当然,如果他们单击链接,则不会激活会话,但知道自己在做什么的人仍然可以使用它。
并且也不要使用秘密cookie。每次请求时都会传输 Cookie。因此,仅仅存在 cookie 并不能验证用户是否打算发出请求。
该怎么做呢?遵循OWASP 建议。使用针对每个请求发出并与会话关联的唯一随机令牌。然后在提交时验证令牌是否有效,然后使令牌失效!它应该只是一次性使用的令牌。通过表格提交,而不是直接附加到链接......