Сериализация PHP успешна, несериализуется ошибка - PullRequest
1 голос
/ 07 октября 2011

Мой код PHP сериализуется, но не десериализуется, в чем может быть проблема?

$serializedColumns = serialize($columnNames);

У меня есть следующий результирующий HTML, где я сохранил сериализованную строку в скрытое поле:

<input id="columns_hidden" name="columns" type="hidden" value="a:3:{i:0;s:8:&quot;Username&quot;;i:1;s:8:&quot;Password&quot;;i:2;s:11:&quot;AccessLevel&quot;;}">

Запрос отправляется в 'AddData.php', где у меня есть мой десериализованный код, подобный этому:

$columns =  unserialize($_REQUEST['columns']);

, когда я вызываю print_r на $columns, он возвращаетпустая строка.

когда я звоню print_r на $_REQUEST['columns'], возвращается:

a:3:{i:0;s:8:\"Username\";i:1;s:8:\"Password\";i:2;s:11:\"AccessLevel\";}

Ответы [ 5 ]

4 голосов
/ 07 октября 2011

Это на самом деле комментарий, но я поместил его здесь для большего внимания: Не делайте этого .

Почему? - Всякий раз, когда вы unserializeДанные, предоставленные запросом вслепую, PHP делает больше, чем вы думаете.Это может создавать объекты, которые опасны для вашего приложения, и вы не можете ничего с этим поделать.

Скрытый ввод можно легко редактировать и манипулировать с помощью редактора DOM или JavaScript для включения вредоносного кода или вредоносных запросов.выстрелил по вашему сайту и быстро его остановил.

Альтернативы - Вместо этого используйте некоторую форму данных, которую вы можете обрабатывать более легко, например, используйте json_encode / json_decode или классическийimplode / explode:

$serializedColumns = implode(',', $columnNames);

и

$columns =  explode(',', $_REQUEST['columns']);

это гораздо более отказоустойчиво и разумно, потому что это статическая обработка данных.

2 голосов
/ 07 октября 2011

Похоже, вы передаете результат сериализации через htmlspecialchars . Это повредит сериализованные данные. Используйте другой метод кодирования, чтобы сделать его безопасным для использования в качестве значения атрибута html, т. Е. base64_encode :

<?php
$serializedColumns = serialize($columnNames);
?>

<input id="columns_hidden" name="columns" type="hidden" value="<?php echo base64_decode($serializedColumns) ?>">

Затем в вашем скрипте обработки:

$columns =  unserialize(base64_decode($_REQUEST['columns']));
1 голос
/ 07 октября 2011

&quot;, вероятно, идет по пути сериализации, так как ; не экранирован.

Вы можете base64_encode значение и затем расшифровать его:

$serializedColumns = base64_encode(serialize($columnNames));

до

$columns =  unserialize(base64_decode($_REQUEST['columns']));
0 голосов
/ 11 мая 2015

Если вы используете VARCHAR для этого столбца, попробуйте изменить столбец MySQL на TEXT.

0 голосов
/ 28 апреля 2015

когда ваши данные публикуются в PHP, похоже, что старые добрые магические кавычки вводят \ перед всеми разделительными кавычками.Вы должны удалить его (удалить косую черту), прежде чем сможете расшифровать / отменить сериализацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...