【问题标题】:Encrypt HTTP POST upload加密 HTTP POST 上传
【发布时间】:2015-10-06 19:01:46
【问题描述】:

我有一个 HTML 表单,它允许用户使用 PHP 的 $_FILES 变量上传文件。

文件上传后,我会针对$_FILES进行一些错误检查,例如$_FILES["size"]

而不是在同一页面上调用move_uploaded_file() 并完成上传。我有另一个提交到第二页的 HTML 表单。 $_FILES 中的数据通过 hidden input types 以 POST 形式传递。

问题:

我不想将值作为简单文本传递,而是希望对文本进行加密(打包),然后在提交后将其解包回下一页上的正常值。

到目前为止,我尝试使用base64_encode 打包内容,然后使用base64_decode 解包,但问题是base64_encode 没有动态更改值。

我知道无论如何都可以修改请求,这只是为了减少技术用户无法欺骗我的网站

【问题讨论】:

  • 听起来您正在尝试重塑$_SESSION。 PHP 已经为您提供了与用户一起存储某些状态的地方。
  • 会话在我的网站上对我来说效果不佳。例如,如果他们在两个选项卡中上传两次,则第一个将被覆盖。
  • 这听起来好像你做错了。重新发布同一个文件(到同一个服务器?)会让你进入 Rube Goldberg 的领域。如果您只想允许每个用户上传一次,请在您的数据库中跟踪该事实,并禁止进一步上传。一旦你从用户那里得到文件并且你已经检查它是有效的,为什么还要麻烦编码/重新发布?
  • “我希望对文本进行某种加密” 你说的文本是什么意思?您正在谈论使用表格发布文件,然后您切换到谈论文本。你能解释一下你是什么意思吗?也许如果你发布一些关于你迄今为止尝试过的代码这对我们来说会更好理解!
  • @DigitalChris 问题是,我允许上传而不需要注册。所以有办法跟踪他们是否是有效用户。

标签: php html forms file-upload


【解决方案1】:

请注意,在 base64 中简单地编码/解码不是“加密”,客户端读取和/或修改该数据是微不足道的。看来你已经意识到了。

如果您必须依赖数据的完整性以及数据已经过验证/清理的事实,更好的解决方案是使用服务器上的密钥对数据进行数字签名。

流程是这样的:

  1. 用户在第 1 页上传文件
  2. 进行验证,计算数字签名,原始数据 + 签名嵌入到第 2 页的隐藏字段中
  3. 用户提交第 2 页,服务器根据数据验证签名。

这样,即使技术用户修改了数据,签名也会失效。用户应该不可能为修改后的数据生成新的有效签名,因为他们没有密钥。

也就是说,如果您遇到这么多麻烦,为什么不在用户提交第 2 页后进行验证?

【讨论】:

  • 哇!您实际上是上帝派来的,第一个真正给出与我相关的解决方案的人。感激不尽。
  • 关于如何生成独特的“签名”的任何想法?
  • 您可以考虑使用openssl_signhash_hmac。也就是说,我的答案的最后一句话不适用吗?两次上传相同的数据有点浪费,无论如何都会更安全。
  • 我不会两次上传相同的数据。第一个页面上传有关文件的信息(大小、扩展等),第二个页面插入在复选框中所做的选择,并插入一个“fileid”作为两个表之间关系的键。
  • 处理所有客户端并一次性上传以避免不一致是否更有意义?如果用户填写了第 1 步但没有填写第 2 步,会发生什么情况?有没有悬空数据?假设您让用户填写第 1 步,您使用 JS 将其全部隐藏并显示第 2 步。用户填写第 2 步并点击提交,然后所有内容都会立即推送到服务器。
猜你喜欢
  • 2011-04-24
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
相关资源
最近更新 更多