【问题标题】:PHP - securely sending data via forms for various user actionsPHP - 通过表单安全地发送数据以进行各种用户操作
【发布时间】:2012-03-13 21:10:00
【问题描述】:

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

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

将这些敏感数据传输到控制器的最常用方法是什么?我什至不愿意建议隐藏字段,因为任何人都可以更改这些字段。某种类型的双向加密,然后在操作中解密并用于确定服务器端的其余部分?也许序列化敏感信息,加密它,然后将它放在表单客户端的单个隐藏字段中,然后在控制器中解密和反序列化?

<?php

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

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

【问题讨论】:

  • 您使用服务器端会话存储来执行此操作,例如$_SESSION。唯一公开共享的是会话标识符 (session_id()),但该会话存储中的所有数据都保存在服务器端。

标签: php forms security post encryption


【解决方案1】:

您根本不会将该数据发送给客户端。

将其存储在会话管理功能中的服务器端(对于 PHP,您可以使用 $_SESSION 变量访问它)并且只发送会话令牌(长随机数,PHP 也有生成/维护良好会话标识符的例程) 到客户端(通常以 cookie 的形式完成)。为了在多步骤过程中跟踪数据(包括用户所处的状态),您永远不想将其暴露给客户端。

【讨论】:

  • 如果用户同时处于两个不同的状态(因此能够分别执行两个事件,也许在两个不同的视图中),这不会使用户用额外的无用信息污染会话信息吗? /跨度>
【解决方案2】:

有趣的问题。我会做的是以下的组合(如果会话不是你的解决方案):

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

【讨论】:

  • 我喜欢这个选项,会话可能很麻烦(请参阅其他答案的评论),而且我不喜欢检查每个帖子参数和对象的每个打开状态以确定哪个事件在某个状态下触发。我会试一试,看看结果如何,这就是银行做事的方式,对吧?提交后对信息进行哈希处理并在服务器端进行比较和解密...
  • 好吧,他们主要是在第一次运行时使用 SSL,除此之外的一切都强烈依赖于银行和国家......但是,AES256 是美国国家安全局 (NSA) 批准的最高机密密码信息,所以它应该足够安全供您使用:)
  • 我同意了,如果我遇到它们,我会报告更好的发现。我肯定也会尝试会话解决方案,但我最喜欢这个,因为它使我的实体能够拥有具有相同参数的多个状态,而不会在提交后一次触发两个相同的状态。
  • 也许我在这里对另一个问题的回答对你来说可能也很有趣,看看吧...stackoverflow.com/questions/9708989/…
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
相关资源
最近更新 更多