我正在与其他一些开发人员编写应用程序。我想保护一些有用的“会话”密钥不被更改。
例如,如果连接时:
$_SESSION['can_access_to_all'] = '0';
例如,某些开发人员可以更改$_SESSION['can_access_to_all'] = '1';
。但是如何保护$_SESSION['can_access_to_all']
不被改变?有解决方案吗?
答案 0 :(得分:0)
或者您可以创建一个类来操作会话。制作一个getter和一个setter,当你想设置检查是否can_access_to_all时你就不会修改它。
<?php
class Session {
public function __set($name, $value) {
if ( $name != 'can_access_to_all' )
$_SESSION[$name] = $value;
}
public function __get($name) {
if ( isset($_SESSION[$name]) )
return $_SESSION[$name];
return null;
}
}
?>
答案 1 :(得分:0)
迈克尔说的是正确的。你不能完全阻止它。如果它只是为了防止错误,你确实可以使用包装器来防止更改某些变量。 EG:
function setSession($k, $v) {
if ($k!='can_access_to_all')
$_SESSION[$k] = $v;
}
但这并不妨碍开发人员在不使用包装器的情况下直接更改会话。
您可以做的另一件事是在最后添加一个包含,将所有固定会话设置回其原始位置。
//do stuff
//include restoresession.inc
和restoresession.inc
$_SESSION['can_access_to_all'] = 0
现在他们仍然可以为当前页面更改它,但是在重定向时,它将被重置为它应该是什么。
但主要问题是,为什么您希望您不能信任的开发人员保留某些文件/设置?
//使用CLASS更新会话,最好是否可以阻止访问实际类及其setter
class MySettings
{
private $can_access_to_all;
/**
* Construct
*/
final public function __construct()
{
//remove if not needed, or use it to make
$this->can_access_to_all = 0;
}
/**
* handle requests
*/
final public function __get($prop) {
return $this->$prop;
}
/**
* Prevent setting of properties
*/
final public function __set($prop, $val) {
trigger_error("Property cannot be set directly");
}
}
$_SESSION['MySettings'] = new MySettings();
答案 2 :(得分:0)
您可以加密或签署会话值。但是您的隐藏算法在代码中,因此如果开发人员具有对它的完全访问权限(或者只知道哪些类/方法与秘密会话一起工作),那么它将无效。
答案 3 :(得分:-1)
你不能做这样的事情。而且你也没有任何理由。