>使用POST和< input type =“hidden”>
>使用$_SESSION [“variable_name”]
我发现第二种方式更容易,但我想知道它是否与第一种方法一样安全,因为在我看到的大多数教程中,它们都使用第一种方式.
有没有什么重要的理由喜欢第一种方式?
$_SESSION
我们启动会话,递增计数器并将其存储在$_SESSION数组中:
<?PHP session_start(); if(!isset($_SESSION["pageviews"])) { $_SESSION["pageviews"] = 0; } $_SESSION["pageviews"]++; ?>
当用户第一次访问此页面时,PHP将生成一个如下所示的随机会话标识符,并要求浏览器将此ID存储在cookie中:
fh4giqncq25ntgs7gjunvj6i33
在服务器上,它将存储并记住有一个pageviews变量,其值为1,属于会话ID fh4giqncq25ntgs7gjunvj6i33.
用户下次访问该页面时,他或她的浏览器将发送先前的会话ID以及请求(假设cookie未过期或被删除). PHP然后识别此ID,并使用pageviews = 1填充$_SESSION数组,然后递增它:pageviews = 2
在安全性方面,请考虑以下问题:
用户是否能够读取存储的数据?否 – 客户端看到的唯一内容是cookie中的随机会话ID;数据本身存储在服务器上.
用户是否能够更改或操作存储的数据?同样,不 – 如果在浏览器中更改了会话ID,PHP将无法再将浏览器与存储的数据联系起来.在这种最糟糕的情况下,用户将获得一个新的会话,从pageviews = 1开始.
会话的主要安全风险是会话劫持,当攻击者以某种方式设法从其他人的浏览器获取会话ID然后将其呈现给服务器,从而冒充其他用户.在我们的例子中,这没有多大意义,因为我们只存储页面视图计数;但是,大多数站点使用会话来跟踪哪个用户从哪个浏览器登录.在那种情况下,窃取他人的会话将意味着访问他们的帐户.
隐藏的领域
在这种情况下,我们有一个带有隐藏字段的表单:
<form action="..." method="post"> <input type="hidden" name="pageviews" value="<?PHP print($pageviews); ?>" /> ... </form>
在服务器上,我们从$_POST中检索pageviews变量并将其递增:
<?PHP $pageviews = @$_POST["pageviews"]; $pageviews++; ?>
因此,我们不是将其存储在服务器上,而是将数据发送到客户端,并在后续请求中将其返回.除了它只适用于POST请求之外,让我们看看这个解决方案的安全相关缺点:
用户是否能够读取存储的数据?是的 – 它直接进入HTML代码中的浏览器.
用户是否能够更改或操作存储的数据?是的 – 没有什么可以阻止用户在他或她的浏览器中打开开发人员工具并将隐藏值更改为他或她喜欢的任何内容.提交表单后,服务器将获取更改的数据.
< input type =“hidden”>的问题是你不能信任客户端,因此你必须验证每个请求中获得的数据.在某些情况下执行此操作可能是合理的,例如填写多页表单,但即使这样也可以通过会话更好地解决.
通过$_SESSION保留数据通常比使用< input type =“hidden”>更安全.因为会话数据存储在服务器上,因此不能被客户端篡改.只有随机会话标识符在cookie中发送到浏览器,该cookie将服务器上的数据绑定到该特定浏览器.