Стоит ли ограничивать прямой доступ к файлам тем?


31

Время от времени я сталкивался со следующим фрагментом в темах:

if ( ! defined('ABSPATH')) exit('restricted access');

Это начало некоторых (всех?) PHP-файлов в теме, и оно должно предотвратить прямой доступ к файлу из-за гнусных источников.

Я вижу, что это не входит в Twenty Ten или Eleven, и я никогда не видел его рекомендованным в официальной документации WordPress. Это кажется хорошей идеей для меня, но я также не знаю достаточно о безопасности, чтобы судить об этом и не могу найти много с Google.

Это то, что я должен иметь в моих пользовательских темах? Если так, должно ли это быть во всех файлах PHP или только некоторых?


7
Просто для более поздних читателей это можно написать короче и лучше:defined('ABSPATH') OR exit;
kaiser

или даже короче:: defined('WPINC') ? : die();P
Тим

Мне также интересно, стоит ли вставлять такой код, чтобы избежать появления ошибок PHP с неопределенными функциями в моих журналах ошибок. Кажется, что боты иногда любят напрямую обращаться к этим файлам, и я получаю сообщения об ошибках типа «Вызов неопределенной функции query_posts ()», поскольку загрузчик WP не был загружен
Matt Keys

Ответы:


26

Обычно вам это не нужно. Но ... есть по крайней мере один крайний случай:

  • Если файл темы является частью шаблона ,
  • и он использует глобальные переменные из вызывающего контекста (родительский файл),
  • и register_globals есть on,
  • и он просто использует эти переменные без какой-либо проверки безопасности ...

… Злоумышленник может вызвать этот файл, установить отсутствующие переменные с помощью GETили POSTи заставить файл темы распечатать их. И тогда это проблема безопасности.

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

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


Если часть шаблона все еще содержит хотя бы один вызов функции, который может привести к фатальной ошибке PHP, будет ли этот сценарий все еще возможен?
Chris_O

@Chris_O Зависит от порядка появления.
fuxia

Имеет смысл и полностью согласен с другой причиной не использовать глобальные переменные между вызовами файлов.
Chris_O

1
Всегда лучше быть в безопасности, чем потом сожалеть. Слишком много безопасности не может повредить, не так ли?
Шон Берг

2
Если вы все делаете правильно, вы не должны использовать код, который не нужен. Этот вопрос является доказательством того, что он усложняет выполнение кода.
fuxia
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.