【问题标题】:Protecting hidden input textboxes保护隐藏的输入文本框
【发布时间】:2013-11-01 18:35:16
【问题描述】:

所以有时当我在页面之间传递变量时,如果我想将变量传递到表单操作中,我只需将其存储在<input type="hidden"> 元素中。这通常效果很好,但我意识到有人可以轻松进入 HTML 标记并简单地将 hidden 更改为输入文本,因此他们可以轻松编辑正在传递的内容(如果说他们正在编辑自己的个人资料,这可能会很糟糕,我已将其 ProfileID 存储在隐藏的输入字段中,并将其更改为其他人的)

我想知道是否有解决此问题的最佳做法?我和一些同事谈过,他们说在提交表单时要在服务器上进行检查,以确保他们没有传递不正确的信息。是最好的方法还是有其他方法?

【问题讨论】:

  • sessions 是否超出您的项目范围?
  • 你可以对值进行编码/加密
  • @ShankarDamodaran 我们确实经常使用会话,但就像我说的那样,我将它存储在隐藏的输入中,以便它可以通过表单传递。我还认为有时我们会破坏会话......我的同事告诉我如何也可以操纵会话变量?
  • @Einacio 他们可以解码/解密它。不要相信用户在没有进一步身份验证的情况下提交的内容。
  • @Izkata 好吧,如果用户可以窃取服务器上mcrypt或openssl等使用的私钥,那么任何保护机制无论如何都没用

标签: php forms security input


【解决方案1】:

在安全方面,您不能相信来自客户端的任何信息,正如您正确指出的那样。这意味着您必须在调用此类页面时将其存储在服务器端。

一种常见的做法是在 cookie 中为每个客户端提供一个会话标识符,在服务器端,您可以将所有敏感信息与该会话标识符相关联。会话标识符应该是随机的,因为如果它是连续的,您可以更改其值并随机劫持其他人的会话。

有多种方法可以存储有关会话标识符的信息。 PHP 中最灵活且可能最容易实现的一种是使用内置会话支持。 PHP 为您处理会话标识符,并允许您将任何可序列化对象存储在 $_SESSION 超全局中。这是一个不错的解决方案,因为会话数据通常存储在服务器的临时文件夹中,如果它是共享服务器,理论上该服务器上的其他网站可能会窥探并查看甚至操纵会话数据。当然,如果你的所作所为真的影响很小,那么就不太可能有人会为了惹你而租用同一台服务器。不过,例如,OAuth 提供商建议您不要将 OAuth 令牌存储在公共环境中的 $_SESSION 存储中。

<?php
session_start();
// place anything you need to save between pages in $_SESSION
$_SESSION["foo"] = array("bar", "baz");
// until you unset $_SESSION["foo"], it will be available in every page that called
// session_start().
?>

最好在用户注销时致电session_destroy,以确保他们的会话数据不会存在超过其需要的时间。

另一方面,您也可以将信息存储在数据库中,例如 MySQL。这在安全性方面更好,因为您应该远离任何没有不同数据库用户或每个服务器用户的不同数据库的主机,并且您可以放心,没有其他人将能够更改(甚至只是看到)会话信息。但是,这并不灵活,因为您需要一个表结构来存储您想要存储的任何内容。

【讨论】:

    猜你喜欢
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2014-10-29
    • 2011-05-11
    相关资源
    最近更新 更多