Выполнить PHP-код на сайте

Главные вкладки

Аватар пользователя VladSavitsky VladSavitsky 18 июня 2008 в 1:24

Задача

Выполнить PHP-код в среде Друпала.

Решение

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

Варианты

Выполнить код (сниппет) можно:

  • В блоке
  • В блоке Execute PHP модуля Devel
  • На странице
  • Отдельном файле

В блоке

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

  • Для того, чтобы увидеть работу кода нужно сохранить блок. Если что-то нужно изменить, то в отличии от страниц, где есть предпросмотр, - блок нужно будет снова открывать и сохранять.
  • Код в блоке, для которого не выставлены ограничения видимости, может сделать весь сайт недоступным. В этом случае нужно выключить блок, используя SQL-сниппет.

Для выполнения кода нужно установить формат ввода: PHP.

На странице

Недостатки:

  • Для страницы нет возможности, в отличии от блока, гибко задавать права доступа и область видимости.

Преимущество страницы перед блоком в том, что:

  • У страниц есть предпросмотр, который позволяет получить результат работы кода (сниппета) без сохранения документа. Это удобно тем, что можно делать отладку и коррекцию кода, а также можно вообще не сохранять документ, если код не нужен постоянно.
  • Если в коде страницы оказалась ошибка, то весь сайт остаётся работоспособным, как и админ-часть, где можно просто удалить "сломанную" страницу. Код в блоке, для которого не выставлены ограничения видимости, может сделать весь сайт недоступным. В этом случае нужно выключить блок, используя SQL-сниппет.

Настройка:

  • Для выполнения кода нужно вставить этот код в тело блока с обязательными тегами:
    <?php
      //код, который нужно выполнить...
    ?>
  • Установить формат ввода: PHP
  • Заполнить необходимые поля
  • Нажать "Предпросмотр", если код не нужно использовать постоянно или "Сохранить", чтобы сохранить документ.

В блоке Execute PHP модуля Devel

Для этого способа нужен установленный модуль Devel.
Работает также как и вставка кода в блок (см. выше).

Отдельном файле

Для этого метода нужен доступ к файлам сайта.

Настройка:

  • Создать файл с расширением ".php" в папке, которая видна веб-серверу
  • Вставить в новый файл код:
    <?php
      //Если файл не в корне веб-сервера, то нужно исправить путь:
      require_once './includes/bootstrap.inc';
      drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

      //код, который нужно выполнить...
    ?>

  • Сохранить файл
  • Вызвать файл из браузера: http://example.com/my_code.php
  • Удалить файл, если он больше не нужен, или ограничить доступ к нему в файле .htaccess.
    См. рецепт Ограничение доступа к файлу cron.php.

Вывод

  • Для отладки кода лучше использовать вставку в тело страницы.
  • Если нужно ограничить доступ к коду - лучше использовать код в блоке.
  • Файл можно использовать только, если есть доступ к файлам.

Оригинал статьи: Выполнить PHP-код на сайте.

Комментарии

Аватар пользователя goodboy goodboy 19 июня 2008 в 10:31

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

Владислав, напишите подробней про этот SQL-сниппет. У меня была подобная ситуация, вылечил, поправив запись в базе.

Аватар пользователя direqtor direqtor 8 сентября 2008 в 7:14

"Ne_L" wrote:
Как понять есть ли "доступ к файлам сайта"
Это значит, что ты можешь создавать, изменять или удалять их на сервере каким-либо образом (FTP, веб-интерфейс, etc.).

Аватар пользователя Ne_L Ne_L 8 сентября 2008 в 19:55

Ок, это есть конечно же - просто подумал что есть какой-то другой тип доступа к фалйам - из самого друпала.. ну не суть - спасибо!
Если я положу свой скрипт.php рядом с файлом cron.php - это нормально? - проблемм не будет? - скрипт будет каждый день запускаться по расписанию, обновлять курсы валют в спецально для них созданной sql таблице.

Аватар пользователя olk olk 8 сентября 2008 в 21:59

Проблем не будет Smile только позаботтесь о безопасности этого скрипта, просто любой "внешний" запрос (или бот) зная имя этого скрипта сможет его запустить и тем самым например загрузить вашу систему по самое ни хочу ... (кстати cron.php - это тоже касается)

Аватар пользователя Ne_L Ne_L 17 сентября 2008 в 20:16

А возможно ли как то сделать, чтобы ошибки, при выполнении скрипта, выводились, когда нажимаем превью (способ "На странице")

Аватар пользователя Ne_L Ne_L 19 сентября 2008 в 1:18

добавил - как написанно в статье

перед

require_once './includes/bootstrap.inc';

всё равно ошибки не отображаются.
Скрипт находится в корневой папке сайта там же где и cron.php

Аватар пользователя pLazMА pLazMА 21 ноября 2008 в 9:23

Почему код не выполняется на странице?

Вставляю простой код в текстовом поле страницы в тегах <?php ... ?>. Устанавливаю php фильтр. Нажимаю препросмотр, как советует автор. И в поле препросмотра пишется текст кода на розовом фоне, а не результат его работы. Что я не так делаю?

Аватар пользователя lmasikl lmasikl 14 мая 2010 в 10:45

Пытаюсь ajax запрос, но в ответ получаю код из файла. Все сделал вроде бы по инструкции, а езультат нулевой, может кто подскажет куда копать?
формат ввода "PHP code"

Решил так. Все дело оказалось в путях

<?php
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
?>

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