PHP - 通过表单安全地发送数据以进行各种用户操作

3

假设我有一个表单,根据用户在多状态过程中的当前状态改变其内容(字段和选项)。假设它始终导致相同的操作,这意味着操作需要找出发生了什么事件以及在哪个实体上。

<form action='/somecontroller/someaction' method='post'></form>

如何将这些敏感数据传输给控制器?我不愿意提议使用隐藏字段,因为任何人都可以更改它们。是否有某种双向加密方式,在操作中进行解密并用于确定其余的服务端?也许可以序列化敏感信息,对其进行加密,然后将其放入表单客户端侧的单个隐藏字段中,再在控制器中进行解密和反序列化?

<?php

$hiddenData = unserialize($this->decrypt($_POST['hiddenData'], SALT));
unset($_POST['hiddenData']);
$data = array_merge($hiddenData, $_POST);
...

基本上,我如何安全地使用表单发送一些数据,而不将其暴露给外部更改,也就是说,如果被更改,是否有确保不会出现问题的方法?在这方面是否有某种最佳实践?


2
你可以通过服务器端的会话存储来实现这一点,例如 $_SESSION。此时唯一公开共享的是会话标识符 (session_id()),但是该会话存储中的所有数据都保留在服务器端。 - hakre
2个回答

4
你根本不需要将这些数据发送给客户端。将其存储在服务器端的会话管理功能中(对于PHP,可以使用 $_SESSION 变量访问),仅向客户端发送会话令牌(长随机数,PHP也有生成/维护良好会话标识符的例程)(通常以cookie的形式)。对于跨多个步骤的数据跟踪(包括用户所处的状态),您永远不希望将其暴露给客户端。

如果用户同时处于两种不同的状态,并且能够分别执行两个事件(可能在两个不同的视图中),那么这样做是否会使用户向会话信息中添加额外的无用信息呢? - Swader

1

有趣的问题。如果会话不适用于您,我会采用以下组合:

  1. 在序列化表示上使用 AES_256 / 修改后的 AES_256 加密/解密
  2. 对变量进行 MD5 + SALT(或类似)哈希,以便与存储的哈希进行比较,确定是否发生了任何操作
  3. 使用用户的 IP 等作为 SALT 生成哈希或加密函数,因此如果用户的 IP 更改,您将知道(请注意:IP 地址可能在某些情况下更改)

我喜欢这个选项,但会话可能会有些麻烦(请参见其他答案的评论),而且我不喜欢检查每个帖子参数和每个对象的打开状态来确定在某个状态下触发哪个事件。我会尝试一下看看结果如何,这就是银行处理事务的方式,对吧?提交后在服务器端进行信息哈希、比较和解密... - Swader
主要是在第一次运行时使用SSL,其余的则强烈依赖于银行和国家...然而,AES256是国家安全局(NSA)批准用于绝密信息的密码,因此对于您的使用应该足够安全 :) - Michal
我选择了这个方案,如果我发现更好的结果,我会回报的。我肯定也会尝试sessions解决方案,但我最喜欢这个方案,因为它使我的实体能够具有相同参数的多个状态,而不会在提交后同时触发两个相同的状态。 - Swader
也许我在这里回答另一个问题的答案对你也有帮助,看一下这个链接:http://stackoverflow.com/questions/9708989/how-to-avoid-opening-two-browser-windows/9709625#9709625 - Michal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接