在浏览器上打开多个选项卡时传输正确的会话数据


Transmitting the Correct Session Data when Multiple Tabs are Opened on a Web Browser

我有一个PHP脚本(脚本a ),它对数据库进行查询,将结果存储在会话变量中,并生成一个HTML页面,其中包含允许用户发布提交的表单(可选)。提交后,存储在会话变量中的结果用于在另一个脚本(脚本B)中进行处理。

由于HTML页面不是唯一的,用户可能会打开多个选项卡,显示由脚本A生成的不同页面。由于session变量只能保存最新生成的页面的数据,因此当用户单击前面的任何选项卡并进行提交时,将使用错误的会话数据集。

防止这种情况发生的一种方法是强制页面在提交之前自动重新加载。在脚本B中重新查询数据库之外,是否有更好的和安全的方法来做到这一点?

生成一个秘密令牌及其散列

将秘密令牌添加到您的$_SESSION

将哈希值作为隐藏的输入元素添加到表单中。

在提交时,从$_SESSION中的秘密令牌创建哈希。

将其与提交的哈希值进行比较。如果不匹配,您就知道该表单不适合您的会话。

你可以扩展它,通过在你的$_SESSION中的哈希键的数据:

$_SESSION[$hash] = your form data
你甚至可以正确地处理多个表单(和多个表单实例)。

对数据库进行查询的PHP脚本(脚本a),将结果存储在会话变量

为什么?存储已经拥有的数据有什么意义?

提交后,存储在会话变量中的结果用于在另一个脚本(脚本B)中进行处理

为什么?为什么你不能直接提交表格给B?

我认为在这里使用会话没有任何意义。或者至少根据你目前的描述。