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


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.