很好地理解CSRF的棘手问题

Dan*_*Dan 8 security xss

我和我的朋友喝啤酒.

来自维基百科:

在所有表单提交和副作用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)

irc*_*ell 4

绝对!切勿使用会话标识符进行 CSRF 保护。

至于为什么?嗯,答案很简单。这样做为会话劫持攻击打开了大门。想象一下,有人出于某种原因将链接复制并粘贴到电子邮件或网络上。现在,电子邮件另一端的人拥有该会话的会话标识符。当然,如果他们单击链接,则不会激活会话,但知道自己在做什么的人仍然可以使用它。

并且也不要使用秘密cookie。每次请求时都会传输 Cookie。因此,仅仅存在 cookie 并不能验证用户是否打算发出请求。

该怎么做呢?遵循OWASP 建议。使用针对每个请求发出并与会话关联的唯一随机令牌。然后在提交时验证令牌是否有效,然后使令牌失效!它应该只是一次性使用的令牌。通过表格提交,而不是直接附加到链接......

  • @Rook:我只是好奇你认为什么是不正确的。如果它没有完全解决问题,那也没关系。我只是好奇我是否可以改进它(并提高我的知识)。除非我遗漏了什么,否则我们的答案是免费的...... (2认同)