Есть ли способ ограничить использование unserialize () PHP только для анализа массивов? По соображениям безопасности. Предположим, что существует злой метод __unserialize () в несерриализованном объекте, который я не хочу звонить!
Есть несколько способов решить эту проблему:
Piwik исправил уязвимость без арифметики со следующей проверкой:
if (preg_match('/^a:[0-9]+:{/', $str) && !preg_match('/(^|;|{|})O:\+?[0-9]+:"/', $str)
Подпишите подписанную строку. Если вы добавите sha1 Hash из сериализованной строки + секрет в Cookie / POST Var. Вы можете быть уверены, что сериализованная строка не обрабатывается.
Напишите свою собственную функцию unserialize. Если вас интересуют только массивы, вам не нужно нестириализовать. Напишите что-нибудь самостоятельно или используйте принятый стандарт, такой как JSON и т. Д.
И, пожалуйста, игнорируйте все комментарии, которые не видят проблему безопасности здесь. unserialize () существует в невероятно высоком проценте приложений PHP5, и большинство книг и руководств даже не говорят о них.
Есть ли способ ограничить использование unserialize () PHP только для анализа массивов? По соображениям безопасности. Предположим, что существует злой метод __unserialize () в несерриализованном объекте, который я не хочу звонить!
Не то чтобы я знаю, нет.
Можно узнать тип сериализованного значения с помощью такой функции, как это , но это тоже вам не поможет, так как любой член массива снова может быть объектом, __wakeup()
вызовом которого является __wakeup()
.
Вам нужно будет расширить эту функцию, чтобы она проходила через все члены сериализованной строки без фактической сериализации. Конечно, возможно, но, возможно, kludgy и медленный.
Единственный другой способ, который приходит на ум, – сделать вызов unserialize()
в среде, в которой не определены классы. Это приведет к сломанному объекту класса __PHP_Incomplete_Class
, который затем вы сможете разобрать. В обычной среде сценариев это, однако, не поможет вам.
Тем не менее, никогда не забывайте, что сериализованный объект никогда не будет содержать никакого кода . Определение класса должно присутствовать в вашей базе кода с помощью других средств.
В свете этого я не уверен, при каких обстоятельствах это может быть проблемой безопасности в первую очередь. Если у вас есть вредоносный код в базе кода, у него будет много шансов выполнить его без необходимости ничего не разбирать, не так ли?