我在接受 POST 之前专门验证用户的会话
如果您的意思是“会话”的通常含义:存储在 cookie 中的持久令牌,用于标识用户和关联的会话数据,那么不,这还不够。即使 POST 请求是由另一个(攻击者)站点引发的,该 cookie 也会由浏览器自动发送。
您在此处查找的关键字是 Cross-Site Request Forgery 或XSRF,攻击者(通过脚本或其他方法)可以使经过身份验证的用户向您的站点发出 GET 或 POST 请求。此类请求通常无法与合法请求区分开来。(有些人尝试通过检查 HTTP 引用数据来这样做,但这是不可靠的。)
这些攻击不像服务器端(SQL、命令)或客户端(HTML、JavaScript)注入那样具有直接破坏性,但它们比两者都更常见:不幸的是,很少有 Web 程序员同时包含适当的对策。直到他们的网站受到 XSRF 漏洞的影响。
有多种方法可以防御 XSRF,但唯一真正有效的方法是在每个可提交的表单中包含一个第三方攻击者不会知道的秘密值。正如 Eimantas 所提到的,这通常被称为 post 键。
有多种方法可以生成这样的秘密信息。一种简单的方法是将随机生成的代码添加到每个用户的帐户详细信息中,然后将其放入表单的隐藏字段中并检查其是否存在于提交中。例如在 PHP 中:
<form method="post" action="delete.php"><div>
<input type="hidden" name="key" value="<?php echo(htmlspecialchars($user['key'])); ?>"/>
<input type="submit" value="Delete" />
</div></form>
if ($_POST['key']!=$user['key'])
// error
攻击者不知道该用户的密钥,因此无法创建包含它的链接/表单。
您还可以使用服务器密钥对用户 ID 使用加密哈希函数,而不是保留单独的代码。使用哈希,您还可以输入其他内容,例如到期时间,以便必须在特定时间范围内提交表单。或者您可以生成一次性交易密钥,您也可以使用它来确保您不能两次提交相同的表单(用于停止重复发布)。