我正在尝试制作一个喜欢/不同的系统,当用户点击帖子上的内容时,他/她的用户ID(存储在会话中)并且帖子ID将通过ajax调用存储在数据库中
然后我想如果某个用户在另一个域上创建一个带有隐形输入字段(其中有一个帖子ID)的html表单,并将其链接提供给检查后的用户,或者正在查看我的网站。
用户将单击该按钮,表单将POST post id发送到我的站点,session包含用户ID,这些将存储在数据库中。
没有好的解决方案出现在我的脑海里。有没有比HTTP引用更可靠的方法来阻止这种情况?
提前致谢
答案 0 :(得分:5)
一种方法是在HTML中插入一个特定于用户会话的秘密变量。这可以防止跨站点伪造。
在PHP中,您将生成一个随机的“密钥”并将其存储在会话中:
$_SESSION['myFormVar'] = md5(mt_rand());
然后在表单中,您将添加为隐藏变量:
<input type="hidden" name="chkVar" value="<?=$_SESSION['myFormVar']?>"/>
您应该通过POST提交表单,最好通过HTTPS提交表单,这样可以更难(但不是不可能)拦截chkVar的值。
在处理发布表单的代码中,将发布的chkVar与会话变量进行比较。在一个理想的世界中,每个请求都有一个独特的chkVar,但是使用一个相同的整个会话通常可以正常工作并防范大多数csrf攻击。
答案 1 :(得分:2)
您在谈论CSRF漏洞利用 这是一个很好的安全问题 它通常由一个只有服务器才知道的密钥来管理 必须在所有表格中使用此密钥 这是一个little tutorial来防范它
答案 2 :(得分:1)
您应该发送的唯一内容是帖子ID,用户ID应该在您通过AJAX调用的脚本中自动获取。假设您已经验证用户已登录,则您拥有这两条信息而不会有任何进一步的安全风险。