如何防止欺骗性发布到类似PHP /不同的系统

时间:2012-01-10 14:28:57

标签: php security post csrf

我正在尝试制作一个喜欢/不同的系统,当用户点击帖子上的内容时,他/她的用户ID(存储在会话中)并且帖子ID将通过ajax调用存储在数据库中

然后我想如果某个用户在另一个域上创建一个带有隐形输入字段(其中有一个帖子ID)的html表单,并将其链接提供给检查后的用户,或者正在查看我的网站。

用户将单击该按钮,表单将POST post id发送到我的站点,session包含用户ID,这些将存储在数据库中。

没有好的解决方案出现在我的脑海里。有没有比HTTP引用更可靠的方法来阻止这种情况?

提前致谢

3 个答案:

答案 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调用的脚本中自动获取。假设您已经验证用户已登录,则您拥有这两条信息而不会有任何进一步的安全风险。