Intereting Posts
получение пустых результатов массива с использованием preg_match_all для значений, которые не соответствуют Как отключить буферизацию вывода в nginx для приложения PHP Прямая трансляция видео с помощью PHP php mysql fulltext search: lucene, sphinx, или? Удалить последнюю запятую или предотвратить ее печать на всех MySQL / PHP Сравнение значений массива с другими значениями из того же массива В PHP, Как вызвать функцию в строке? Joomla: вызов вспомогательной функции изнутри модели? Как перемещаться внутри переменной PHP: отправить электронную почту через cronjob и установить количество отправки электронной почты за минуту Процесс виртуализации PHP – получение родительского вывода в родительском SQL JOIN – нужно вернуть один идентификатор продукта, но все его варианты (например, размер, цвет) Отображение сообщений «Подписчика» и личных сообщений пользователя file_get_contents и file_put_contents с большими файлами Как группировать сообщения сортировки ans в wordpress по дате?

Ограничить unserialize () для возврата массивов?

Есть ли способ ограничить использование unserialize () PHP только для анализа массивов? По соображениям безопасности. Предположим, что существует злой метод __unserialize () в несерриализованном объекте, который я не хочу звонить!

Solutions Collecting From Web of "Ограничить unserialize () для возврата массивов?"

Есть несколько способов решить эту проблему:

  1. Используйте регулярное выражение для сериализованной строки:

Piwik исправил уязвимость без арифметики со следующей проверкой:

if (preg_match('/^a:[0-9]+:{/', $str) && !preg_match('/(^|;|{|})O:\+?[0-9]+:"/', $str) 
  1. Подпишите подписанную строку. Если вы добавите sha1 Hash из сериализованной строки + секрет в Cookie / POST Var. Вы можете быть уверены, что сериализованная строка не обрабатывается.

  2. Напишите свою собственную функцию unserialize. Если вас интересуют только массивы, вам не нужно нестириализовать. Напишите что-нибудь самостоятельно или используйте принятый стандарт, такой как JSON и т. Д.

И, пожалуйста, игнорируйте все комментарии, которые не видят проблему безопасности здесь. unserialize () существует в невероятно высоком проценте приложений PHP5, и большинство книг и руководств даже не говорят о них.

Есть ли способ ограничить использование unserialize () PHP только для анализа массивов? По соображениям безопасности. Предположим, что существует злой метод __unserialize () в несерриализованном объекте, который я не хочу звонить!

Не то чтобы я знаю, нет.

Можно узнать тип сериализованного значения с помощью такой функции, как это , но это тоже вам не поможет, так как любой член массива снова может быть объектом, __wakeup() вызовом которого является __wakeup() .

Вам нужно будет расширить эту функцию, чтобы она проходила через все члены сериализованной строки без фактической сериализации. Конечно, возможно, но, возможно, kludgy и медленный.

Единственный другой способ, который приходит на ум, – сделать вызов unserialize() в среде, в которой не определены классы. Это приведет к сломанному объекту класса __PHP_Incomplete_Class , который затем вы сможете разобрать. В обычной среде сценариев это, однако, не поможет вам.

Тем не менее, никогда не забывайте, что сериализованный объект никогда не будет содержать никакого кода . Определение класса должно присутствовать в вашей базе кода с помощью других средств.

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