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

31

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

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

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

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

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

mrwweb
источник
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