Статьи

Проблема с «экстрактом»

В новостях на выходных Стефан Эссер (Stefan Esser) из блога по безопасности PHP написал резкую критику новой статьи 10 советов, которую должен знать каждый разработчик PHP, часть 2 (часть серии из двух частей ).

Помимо того, что автор статьи Джеффри Васька, кажется, не может сосчитать до десяти (спасибо Жюлю за то, что заметил это), статья содержит несколько сомнительных советов в отношении Стефана, и он исключение из одного, в частности, совета, совет 5 ( второй совет 5; мы щедро дали два совета, помеченных как «совет 5», которые объясняют использование языковой конструкции extract для извлечения содержимого переменной $ _POST в локальные переменные.

От Стефана :

использование extract () без использования префиксов или параметра EXTR_SKIP обычно представляет собой очень большую дыру в безопасности, поскольку позволяет внешнему злоумышленнику перезаписывать каждую переменную, включая суперглобальные (если вы не используете Hardening-Patch), и во многих случаях это может привести к Внедрение SQL или даже уязвимости удаленного выполнения кода

В PHP-приложениях довольно распространено использование неинициализированных переменных (одна из причин, по которой отладка с уведомлениями является хорошей идеей). Если вы ссылаетесь на переменную $ username без предварительной инициализации, вы можете ошибочно полагать, что ее начальное значение будет нулевым. Извлечение , как и register_globals, может опровергнуть это предположение, позволяя конечным пользователям инициализировать переменную $ username. Короче говоря, это все равно что снова включить register_globals . Извлечение может использоваться безопасно и, следовательно, не является проблемой безопасности само по себе, но может быть смертельным для вашей безопасности в сочетании с любым количеством других неаккуратных методов кодирования.

На мой взгляд, самая большая проблема с extract, а также главная причина, по которой это представляет угрозу безопасности, на самом деле заключается в том, что extract делает код трудным для чтения и отладки. Попробуйте сохранить некоторый код, где кто-то использовал extract, и вы, вероятно, обнаружите, что кричите «Откуда эта переменная ?!» Переменные, кажется, материализуются из воздуха. Учтите следующее.

// see if the user is authorised $details = $this->getuserdetails(); extract($details); if ($access[$accesszone]) $this->authorise();

// see if the user is authorised $details = $this->getuserdetails(); extract($details); if ($access[$accesszone]) $this->authorise();

// see if the user is authorised $details = $this->getuserdetails(); extract($details); if ($access[$accesszone]) $this->authorise();

// see if the user is authorised $details = $this->getuserdetails(); extract($details); if ($access[$accesszone]) $this->authorise();

Откуда взялись $ access и $ accesszone? Voodoo!

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