За последние 24 часа нас посетили 24875 программистов и 1734 робота. Сейчас ищут 896 программистов ...

Проблема с сессиями.

Тема в разделе "Прочие вопросы по PHP", создана пользователем titch, 17 фев 2011.

  1. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    Никогда не попадает в блок, в котором берутся старые данные. Каждый раз перезаписывается. Написал за полчаса, утром надо, весь день на ногах. Если не сложно посмотрите свежим взглядом. Если до утра никто не посмотрит, закройте тему, я сам поправлю.
    PHP:
    1. <?php
    2.     final class Forcer {
    3.         public function __destruct()
    4.         {
    5.             Base::force();
    6.         }
    7.     }
    8.     final class Base {
    9.         static private $init = false;
    10.         static private $secret;
    11.         static private $destruct;
    12.         private function __construct () {} //объект не должен быть создан
    13.         private function key()
    14.         {
    15.             return "123456";
    16.         }
    17.         private function initMe ()
    18.         {
    19.             if (self::$init == true)
    20.                 return true;
    21.             self::$destruct = new Forcer();
    22.             self::$secret = unserialize( self::key() ^  $_SESSION["FrameVar"]); //типа здесь шифрование
    23.             //здесь еще куча проверок на подлинность того что я прочитал
    24.             if (self::$secret === NULL)
    25.             {
    26.                 self::$secret = array();
    27.             }
    28.             self::$init = true;
    29.             return true;
    30.         }
    31.         public function saveVar ($alias,$var,$pass)
    32.         {
    33.             self::initMe();
    34.  
    35.             if(array_key_exists($alias,self::$secret))
    36.                 if (self::$secret[$alias]["pass"] != $pass)
    37.                     return false;
    38.  
    39.             self::$secret[$alias] = array ("pass"=>$pass,"var"=>$var);
    40.             return true;
    41.         }
    42.         public function getVar ($alias,$pass)
    43.         {
    44.             self::initMe();
    45.             if(!array_key_exists($alias,self::$secret))
    46.                 return false;
    47.             if (self::$secret[$alias]["pass"] != $pass)
    48.                 return false;
    49.             return self::$secret[$alias]["var"];
    50.         }
    51.         public function force ()
    52.         {
    53.             self::initMe();
    54.             $_SESSION["FrameVar"] = serialize(self::$secret) ^ self::key();
    55.         }
    56.     }
    57.  
    58.     session_start();
    59.     echo "Session contain:<br>";
    60.     var_dump($_SESSION["FrameVar"]);
    61.     echo "<br>";
    62.     $pass = "ерундовый пароль";
    63.  
    64.     if(($a = Base::getVar("fignya",$pass))===false)
    65.     {
    66.         echo "Old a: ".$a."<br>";
    67.         $a = "Ерунда";
    68.         Base::saveVar("fignya",$a,$pass);
    69.         echo "Saved: ".(Base::getVar("fignya",$pass));
    70.     }
    71.     else
    72.     {
    73.         //никогда не попадает в этот блок
    74.         echo "Cached: ".$a;
    75.     }
    76.    
    77.     echo "<br>Session contain:<br>";
    78.     var_dump($_SESSION["FrameVar"]);
    79.     echo "<br>end";
    80. ?>
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    PHP:
    1. <?php
    2.  
    3. final class Forcer {
    4.  
    5.   public function __destruct() {
    6.     Base::force();
    7.   }
    8.  
    9. }
    10.  
    11. final class Base {
    12.  
    13.   static private $init = false;
    14.   static private $secret;
    15.   static private $destruct;
    16.  
    17.   private function __construct() {
    18.  
    19.   }
    20.  
    21. //объект не должен быть создан
    22.  
    23.   private function key() {
    24.     return "123456";
    25.   }
    26.  
    27.   private function initMe() {
    28.     if (self::$init == true)
    29.       return true;
    30.     self::$destruct = new Forcer();
    31.     self::$secret = unserialize(self::key() ^ $_SESSION["FrameVar"]); //типа здесь шифрование
    32.     //здесь еще куча проверок на подлинность того что я прочитал
    33.     if (self::$secret === NULL) {
    34.       self::$secret = array();
    35.     }
    36.     self::$init = true;
    37.     return true;
    38.   }
    39.  
    40.   public function saveVar($alias, $var, $pass) {
    41.     self::initMe();
    42.  
    43.     if (array_key_exists($alias, self::$secret))
    44.       if (self::$secret[$alias]["pass"] != $pass)
    45.         return false;
    46.  
    47.     self::$secret[$alias] = array("pass" => $pass, "var" => $var);
    48.     return true;
    49.   }
    50.  
    51.   public function getVar($alias, $pass) {
    52.     echo "+++A";
    53.     self::initMe();
    54.     echo "B";
    55.     if (!array_key_exists($alias, self::$secret)) {
    56.       echo "C";
    57.       return false;
    58.     }
    59.     if (self::$secret[$alias]["pass"] != $pass) {
    60.       echo "D";
    61.       return false;
    62.     }
    63.     echo "E";
    64.     return self::$secret[$alias]["var"];
    65.   }
    66.  
    67.   public function force() {
    68.     self::initMe();
    69.     $_SESSION["FrameVar"] = serialize(self::$secret) ^ self::key();
    70.   }
    71.  
    72. }
    73.  
    74. echo "Session contain:<br>";
    75. var_dump($_SESSION["FrameVar"]);
    76. echo "<br>";
    77. $pass = "ерундовый пароль";
    78. $a = Base::getVar("fignya", $pass);
    79. echo '$a = ';
    80. echo "\n";
    81. if ($a === false) {
    82.   echo "Old a: " . $a . "<br>";
    83.   $a = "Ерунда";
    84.   Base::saveVar("fignya", $a, $pass);
    85.   echo "Saved: " . (Base::getVar("fignya", $pass));
    86. } else {
    87.   //никогда не попадает в этот блок
    88.   echo "Cached: " . $a;
    89. }
    90.  
    91. echo "<br>Session contain:<br>";
    92. var_dump($_SESSION["FrameVar"]);
    93. echo "<br>end";
    94. ?>
    у меня $a становится false на 55 строке. Это не нормально? =)

    А нафига шифровать сессионные переменные? боишься гномика в компьютере?
     
  3. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    Это не нормально! о_О
    Вот этих гномиков и боюсь :Р
    Сейчас поем что-либо и буду копать
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    titch
    ну как?
     
  5. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    Всё успешно допилено было в срок. В php XOR не коммутативный какой-то. По крайней мере, над строками. Заменил на нормальное шифрование и всё завелось