-2

我正在与其他一些开发人员一起编写应用程序。我想保护一些有用的“会话”密钥不被更改。

例如,如果连接时:

$_SESSION['can_access_to_all'] = '0';

例如,一些开发人员可以更改$_SESSION['can_access_to_all'] = '1';。但是我怎样才能防止$_SESSION['can_access_to_all']被改变呢?有解决办法吗?

4

4 回答 4

0

您可以加密或签署会话值。但是您的 crypt 算法在代码中,因此如果开发人员可以完全访问它(或者只知道哪些类/方法适用于秘密会话),它将无法工作。

于 2012-11-27T11:26:12.803 回答
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;
   }
}
?>
于 2012-11-27T11:15:40.607 回答
0

迈克尔说的是正确的。你无法完全阻止它。如果只是为了防止错误,您确实可以使用包装器来防止更改某些变量。例如:

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();
于 2012-11-27T11:23:49.350 回答
-1

你不能做这样的事情。而且真的没有任何理由你应该这样做。

于 2012-11-27T11:13:40.247 回答