PHP __ Объект PHP_Incomplete_Class с моим $ _SESSION данные

У меня есть установка сайта, которая, на загрузке страницы, поворачивается, весь пользователь отправил строки в объекты SafeString. Для незнакомых с SafeString, это в основном вынуждает пользователя повторить санированные данные, предотвращающие XSS и этажерку..

Так или иначе существует проблема. Мой $ _SESSION массив заполнен __PHP_Incomplete_Class Object. Из того, что я читал, это происходит из-за не инициализации класса перед сессией и затем хранением объектов класса на сессии.

Вот мой код:

require_once __WEBROOT__ . '/includes/safestring.class.php'; 

$temp = array
(
   &$_SERVER, &$_GET, &$_POST, &$_COOKIE,
   &$_SESSION, &$_ENV, &$_REQUEST, &$_FILES,
   &$HTTP_SERVER_VARS, &$HTTP_GET_VARS,
   &$HTTP_POST_VARS, &$HTTP_COOKIE_VARS,
   &$HTTP_POST_FILES, &$HTTP_ENV_VARS
); 

function StringsToSafeString(&$array)
{
   foreach ($array as $key => $value)
   {
      if (is_string($array[$key]))
      {
         $array[$key] = new SafeString($value);
      } 

      if (is_array($array[$key]))
      {
         StringsToSafeString($array[$key]);
      }
   }
}

StringsToSafeString($temp);

unset($temp);

Я не могу думать о способе переписать это, которое решило бы проблему:/

Какие-либо идеи?

38
задан dave 6 January 2010 в 01:32
поделиться

3 ответа

Нужно просто включить класс safeestring.class. php перед вызовом session_start(), когда вы хотите прочитать объекты SafeString из переменной $_SESSION:

<?php

require_once __WEBROOT__ . '/includes/safestring.class.php';    
session_start();

print_r($_SESSION);

и да, если вы используете PHP-фреймворк, который (скорее всего) вызывает внутри session_start(), убедитесь, что вам заранее требуется_once файл класса (используйте крюки или любые другие механизмы, которые предоставляет фреймворк).

7
ответ дан 27 November 2019 в 03:11
поделиться

Когда вы обращаетесь к $_SESSION, вы не просто меняете копию текущего сценария данных, прочитанных из сессии, вы записываете объекты SafeString обратно в активный сеанс.

Но помещение пользовательских объектов в сессию является изворотливым, и я обычно пытаюсь избежать этого. Чтобы это сделать, Вы должны определить соответствующий класс перед вызовом session_start; если Вы этого не сделаете, то обработчик сессий PHP не будет знать, как десериализовать экземпляры этого класса, и в итоге вы получите __PHP_Incomplete_Class Object.

Так что избегайте лязговения сессии. Если вы должны использовать этот подход, сделайте копию данных из $_SESSION в локальный массив $mysession. Однако, я должен сказать, что вся идея SafeString опасна и неработоспособна; я не думаю, что этот подход когда-нибудь будет водонепроницаемым. Если строка исходного текста "безопасна" - это не имеет никакого отношения к тому, откуда она пришла, это свойство того, как вы кодируете ее для целевого контекста.

Если вы получаете другую текстовую строку из другого источника, такого как база данных, или файла, или вычисляете ее внутри самого скрипта, то она требует точно такой же обработки, как и строка, которая пришла от пользователя: она должна быть htmlspecialcharsed. Вам всё равно придётся написать этот escape; safeestring ничего не получит. Если вам нужно отправить строку в другой формат назначения, вам понадобится другой escape.

Вы не можете инкапсулировать все проблемы обработки строк в один удобный ящик и никогда не думать о них снова; просто строки работают не так.

.
63
ответ дан 27 November 2019 в 03:11
поделиться

Ответ Лукмана правильный. Но вы уже упоминали об этом в своем вопросе, поэтому, по-видимому, вы не можете создать экземпляр класса до начала сеанса по какой-то причине.

Вы можете проверить, запускаются ли сеансы автоматически в конфигурации php: http://www.php.net/manual/en/session.configuration.php#ini.session.auto-start

Если это так, и вы не можете с этим помочь, вы можете проверить, можете ли вы перед этим должны быть автоматически загружены ваши классы: http://php.net/manual/en/language.oop5.autoload.php

Если ничего не помогает, вы все равно можете сериализовать объекты, прежде чем сохранять их в сеансе, и десериализовать их каждый из них. получить их: http://php.net/manual/en/function.serialize.php

Я не вижу в вашем коде, где вы храните свои переменные, но это будет что-то вроде

$mystuff = unserialize($_SESSION["mystuff"]);
$mystuff->dostuff();
$_SESSION["mystuff"] = serialize($mystuff);

Не забудьте загрузить класс определение перед десериализацией переменных

$ 2c, * -pike

3
ответ дан 27 November 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: