Я много раз видел, как люди говорили, что не следует использовать собственный фильтр PHP / PHP (из пользовательского интерфейса Drupal) в блоках, узлах, аргументах представления, правилах и т. Д. Я немного искал и не нашел много, похоже это лучшая практика Drupal, которую все "просто знают".
Я понимаю, что это представляет потенциальную угрозу безопасности, особенно в руках конечных пользователей или людей, плохо знакомых с Drupal или PHP, но как разработчик / строитель сайтов, каковы реальные причины не использовать пользовательский PHP из пользовательского интерфейса Drupal?
Ответы:
Несколько причин:
Может быть больше причин, но этого должно быть достаточно :)
источник
require_once $_SERVER['DOCUMENT_ROOT'].'/sites/all/themes/myTheme/php/stuff.php';
и написать оставшуюся часть кода в вашей IDE / текстовом редакторе. Иногда это нелегкая работа или создание собственного модуля даже в качестве хорошего PHP-разработчика может занять очень много времени. Один короткий пример: условные действия Ubercart. Но это правда, нехорошо хранить наш код в БД.Этот код трудно отлаживать и поддерживать. Я не знаю, как использовать контроль версий для такого рода PHP-кода.
И это действительно потенциальная угроза безопасности для людей, плохо знакомых с Drupal или PHP,
источник
Рассматривая случай использования фильтра PHP в узле, причина не использовать его состоит в том, что вы ограничиваете пользователей, которые могут редактировать этот узел, если вы не хотите разрешить всем пользователям использовать фильтр PHP.
Вместо использования фильтра PHP лучше использовать пользовательский модуль, который заменяет определенный текст в содержимом узла на результат кода, который он выполняет (без использования
eval()
), или который добавляет свой собственный текст к содержимому тела узлов. В этом случае любой пользователь может редактировать узел, не имея разрешения на добавление произвольного кода PHP, который затем запускается фильтром PHP.Как правило, этого лучше избегать,
eval()
потому что это снижает читабельность кода, возможность прогнозировать путь к коду (и возможные последствия для безопасности) до времени выполнения и, следовательно, возможность отладки кода.Помимо разработки или тестового сайта, я бы не включил фильтр PHP и не использовал PHP-код, который был передан
eval()
.Фильтр PHP был удален из Drupal 8. Теперь он является сторонним модулем , на который не распространяется политика безопасности . Вероятно, это еще одна причина, по которой он не используется на производственных серверах (если уже приведенные причины не убедили вас).
источник
В качестве обходного пути для различных проблем, указанных выше - сложности сопровождения кода, контроля версий, поиска ошибок, у вас есть немного «клугейная» возможность:
Создайте функции (назовите их внимательно, в соответствии с тем, что они делают) в некотором файле, который всегда включен - если у вас есть собственный модуль, который вы пишете для сайта, это отличное место для размещения этих функций. В таком случае php, который вы вводите, просто:
return my_specialfunc($somevar);
-$somevar
здесь, возможно, объект узла, над которым работали, или любые другие переменные, которые здесь важныЯ нахожу, что я все еще обычно хочу гибкость, в некоторых местах, для вызова моего собственного кода. Используя эту технику, поддерживать код легко, так как это просто вопрос изменения функции в файле. Обнаружение ошибок легко, так как функция будет отображаться в обратном направлении.
Однако обратите внимание, что это не решает потенциальные проблемы безопасности. Это во многом зависит от безопасности ядра Drupal. Вообще, код, содержащий базу данных, часто является пятой безопасности ахиллеев - функциональные возможности, использующие код, содержащийся в базе данных, имеют тенденцию быть гораздо более подверженными эксплуатации, и безопасность вокруг них должна быть очень жесткой. Тем не менее, Drupal в целом неплохо поддерживал безопасность для этих проблем - они возникли, а затем быстро исправлены / решены с помощью новых выпусков.
источник
Вот причина уязвимости в безопасности, чтобы не давать это разрешение своим пользователям, если вы не хотите, чтобы пользователи без прав администратора изменяли базу данных напрямую.
Взлом учетных данных Drupal db
источник
Вместо того, чтобы делать что-то подобное
return functionname($object)
, было бы лучше использовать систему токенов / фильтров, насколько это возможно. Существуют такие модули, как Insert View и Embed Node, которые могут помочь в обычных обстоятельствах, когда люди захотят встроить PHP в тела узлов или блоков.источник
Вы должны заботиться о переносимости ваших данных. Что если вы перенесете свои узлы с drupal 7 на drupal 8 и
<?php whatever_function_that_does_not_exist_anymore(); ?>
в нем есть текст основного текста какого-либо узла ?Не думайте о своем проекте в течение 5 месяцев, но в течение 5 лет. На мой взгляд, обновления, передовой опыт и мобильность являются важными аспектами любого хорошего ИТ-проекта.
Использование как можно меньшего количества модулей также является одним из аспектов этого.
источник