我正在与其他一些开发人员一起编写应用程序。我想保护一些有用的“会话”密钥不被更改。
例如,如果连接时:
$_SESSION['can_access_to_all'] = '0';
例如,一些开发人员可以更改$_SESSION['can_access_to_all'] = '1';
。但是我怎样才能防止$_SESSION['can_access_to_all']
被改变呢?有解决办法吗?
我正在与其他一些开发人员一起编写应用程序。我想保护一些有用的“会话”密钥不被更改。
例如,如果连接时:
$_SESSION['can_access_to_all'] = '0';
例如,一些开发人员可以更改$_SESSION['can_access_to_all'] = '1';
。但是我怎样才能防止$_SESSION['can_access_to_all']
被改变呢?有解决办法吗?
您可以加密或签署会话值。但是您的 crypt 算法在代码中,因此如果开发人员可以完全访问它(或者只知道哪些类/方法适用于秘密会话),它将无法工作。
或者您可以创建一个类来操作会话。制作一个 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;
}
}
?>
迈克尔说的是正确的。你无法完全阻止它。如果只是为了防止错误,您确实可以使用包装器来防止更改某些变量。例如:
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
现在他们仍然可以为当前页面更改它,但是在重定向时它将被重置为应有的状态。
但主要问题是,您为什么要让您不信任的开发人员掌握某些文件/设置?
//UPDATE FOR SESSION WITH CLASS,最好能阻止对实际类及其设置器的访问
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();
你不能做这样的事情。而且真的没有任何理由你应该这样做。