因此,有时当我在页面之间传递变量时,如果我想将变量传递给表单操作,我只需将其存储在<input type="hidden">
元素中。这通常很有效,但我意识到有人可以轻松进入HTML标记,只需将hidden
更改为键入文本,因此他们可以轻松编辑传递的内容(如果他们正在编辑自己的个人资料,这可能会很糟糕我已经在隐藏的输入字段中存储了他们的ProfileID,他们将其更改为其他人的<)>
我想知道是否有解决此问题的最佳做法?我和一些同事谈过,他们说当他们提交表格时,会在服务器上放置支票,以确保他们没有传递不正确的信息。是最好的方式还是其他方式?
答案 0 :(得分:3)
安全方面,您无法信任来自客户端的任何信息,正如您所正确指出的那样。这意味着在调用此类页面时必须将其存储在服务器端。
通常的做法是在cookie中为每个客户端提供会话标识符,在服务器端,您可以将所有敏感信息与该会话标识符相关联。会话标识符应该是随机的,因为如果它是顺序的,你可以改变它的值并随机劫持别人的会话。
有多种方法可以存储有关会话标识符的信息。 PHP中最灵活的一个,可能是最容易实现的,是使用内置的会话支持。 PHP为您处理会话标识符,并允许您在$_SESSION
超全局中存储任何可序列化对象。这是一个好的解决方案,因为会话数据通常存储在服务器的临时文件夹中,如果它是共享服务器,那么该服务器上的其他网站理论上可能会窥探并查看甚至操纵会话数据。当然,如果你所做的事情确实影响很小,那么有人不太可能只是为了弄乱你而租用同一台服务器。不过,例如,OAuth提供商建议您不要在公共环境中的$_SESSION
存储中存储OAuth令牌。
<?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。这在安全方面更好,因为您应该从没有不同数据库用户的任何主机或每个服务器用户的不同数据库中逃脱,并且您可以放心,没有其他人能够更改(甚至只是看到)会话信息。但是,这并不灵活,因为您需要一个表结构来存储您想要存储的任何内容。