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

Dru*_*ust 4 php security post csrf

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

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

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

我脑子里没有好的解决方案.有没有比HTTP引用更可靠的方法来防止这种情况?

提前致谢

Pau*_*ain 5

一种方法是在HTML中插入一个特定于用户会话的秘密变量.这可以防止跨站点伪造.

在PHP中,您将生成一个随机的"密钥"并将其存储在会话中:

$_SESSION['myFormVar'] = md5(mt_rand());
Run Code Online (Sandbox Code Playgroud)

然后在表单中,您将添加为隐藏变量:

<input type="hidden" name="chkVar" value="<?=$_SESSION['myFormVar']?>"/>
Run Code Online (Sandbox Code Playgroud)

您应该通过POST提交表单,最好通过HTTPS提交表单,这样可以更难(但不是不可能)拦截chkVar的值.

在处理已发布表单的代码中,将发布的chkVar与会话变量进行比较.在一个理想的世界中,每个请求都有一个独特的chkVar,但是使用一个相同的整个会话通常可以正常工作并防范大多数csrf攻击.