PHP / десериализация - безопасно ли десериализовать значение $ _GET? - PullRequest
2 голосов
/ 29 января 2011

Я передаю массивы urlencode () d serialize () d вокруг моих веб-страниц через $ _GET [].

Безопасно ли десериализовать () значение из $ _GET?Десериализованный массив иногда будет показан пользователю.Будет ли возможность для пользователя выставлять / ссылаться на переменные или функции и т. Д. В моем коде?Другими словами, при десериализации значения PHP обрабатывает его как данные или код?

Обновление:

Я вижу, что в документации говорится:также будет сохранено. Любая другая ссылка будет потеряна. "

Так что это значит, что я в безопасности?: -)

Ответы [ 4 ]

6 голосов
/ 29 января 2011

Абсолютно, положительно, нет.

Вы не должны слепо доверять чему-либо со стороны клиента, однако есть способ, которым вы можете дать себе больше уверенности.

Я предполагаю, чтоЕсли у вас есть сериализованные данные PHP, поступающие со стороны клиента, этот клиент получил их с сервера в какой-то момент?Если это так, и клиент не изменяет данные, вы можете включить хеш вместе с данными, чтобы убедиться, что они не были подделаны.

Другой альтернативой будет десериализация объекта,но расцените его как «испорченный», затем скопируйте и повторно проверьте несериализованные данные в «чистый» объект.

6 голосов
/ 29 января 2011

Этот метод так же «безопасен», как и любой другой тип входящих GET или POST-данных - вам всегда потребуется санировать данные перед началом работы с ним!Но есть и другие проблемы с десериализацией пользовательских данных.

При десериализации объекта PHP будет проверять, есть ли у класса __wakeup магический метод .Этот метод будет выполнен при его наличии.

Теперь это не является серьезной дырой в безопасности, поскольку определение класса никогда не передается в сериализованных данных.Любой вредоносный код должен уже присутствовать в системе.Однако существуют возможные сценарии, в которых это может быть проблемой (например, система плагинов, которая может устанавливать сторонний код), и я был бы очень осторожен с этим.

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

Кодирование JSON было бы более безопасным способом, поскольку оно может содержать только «тупые» данные.

0 голосов
/ 29 января 2011

Да, это безопасно. Вы спрашиваете, безопасно ли сериализовать значение массива $ _GET. Да, это безопасно. Ничего не выполняется во время сериализации массива. Поскольку массив $ _GET не содержит никаких объектов, только параметры из строки запроса, он не может причинить вреда при сериализации / десериализации.

Вы упомянули что-то, что вы видели в документации о циркулярных ссылках. Не беспокойтесь об этом, это не применимо в вашем случае, потому что в массиве $ _GET нет объектов.

Что касается использования фактических данных из массива $ _GET, то это другой вопрос, и ответ будет отрицательным, небезопасно использовать данные из массива $ _GET без применения какого-либо фильтра или проверки сначала

0 голосов
/ 29 января 2011

Вы сериализуете только часть данных объектов / массивов / переменных, фактический исполняемый код не сериализуется - в этом нет никакого смысла - сериализация помогает передавать ваши данные между двумя разными мирами.там исполняемый код может быть одинаковым или разным - для данных это не имеет значения.

Хотя возможные взломы были бы возможны - но только на основе данных - классы, типы и значения могут различаться - дело в том, как справиться с ошибками при десериализации.

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