2

我有一个应用程序,它使用几种不同的形式来执行各种操作。一些表单访问来自其他表单提交的数据。

例如:用户在一个表单上下新订单并在另一个表单中添加新项目,这些项目可以添加到订单中。

因此,这导致用户可能正在添加订单并意识到必须先添加商品。所以自然会打开一个新标签来执行此操作,而不是丢失添加到订单中的信息。

目前我有一个$_SESSION['form']变量让表单处理脚本知道表单提交后使用哪个函数。问题是打开多个选项卡时,此值将被最后打开的选项卡覆盖。我对如何处理这个问题有几个想法,但到目前为止还没有什么理想的。

想法一:使用哈希值来识别不同的页面加载并将哈希作为隐藏字段发送

$hash = $_POST['hash'];
$form = $_SESSION[$hash]['form'];

问题:会话超载。每次加载表单时,该方法都会生成一个新的会话值,以唯一标识表单提交。我可以在提交时取消设置该值,但是如果加载了表单页面并且从不提交,或者页面刷新了怎么办。我宁愿保持会话尽可能轻。

思路二$_SESSION['form']:点击提交时使用AJAX设置值

问题:不使用 JS 的用户。如果可能的话,我希望能够继续为喜欢禁用 JS 的用户提供支持,尽管这种方法看起来可能会更好一些。但是,我不确定这里是否存在浏览器兼容性问题。

思路三:为每个窗口创建一个hash id

问题:PHP 无法区分浏览器选项卡。这将是迄今为止最理想的。

想法四:将表单处理脚本拆分为多个文件,从而无需使用值来选择要使用的函数。

问题:不方便,但如果它被证明是处理这个问题的唯一真正方法,我对这个想法持开放态度。不过,这将需要进行相当多的重组。

关于如何在 PHP 中安全管理不同选项卡和会话信息的任何想法?

4

1 回答 1

1

这只是我的意见,但我会使用想法 #1——每次加载表单时,给它一个随机散列(只需 md5 的 time() + 随机数就足够了),然后像他们一样跟上这些散列是唯一的窗口标识符。

是的,它可能会使您的会话膨胀一点,但如果它不会减慢用户的体验,我不会担心。如果它真的困扰您,您可以跟踪您为用户(在会话中)创建了多少窗口 ID,并将其限制为 100 或 1000。这将防止恶意用户编写脚本来打开数百万个窗口.

请记住,当用户的会话被破坏(通过注销/关闭浏览器)时,所有这些哈希也消失了。如果你真的很勤奋,你可以有一个哈希过期系统。就像,2 小时后,他们将从会话中删除。

但老实说——如果是我,我会把他们留在会议上,不用担心。

只是我的 2 美分,理查德

于 2013-07-07T20:09:30.630 回答