禁用会话修改(php)

时间:2012-11-27 11:10:38

标签: php session protection

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

例如,如果连接时:

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

例如,某些开发人员可以更改$_SESSION['can_access_to_all'] = '1';。但是如何保护$_SESSION['can_access_to_all']不被改变?有解决方案吗?

4 个答案:

答案 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)

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