Я хочу использовать именованный канал для связи между сервером-скриптом PHP и сервисом, то есть процессом (скриптом Python), слушающим на другом конце канала. Эта служба намеренно работает от имени непривилегированного пользователя, а также создает канал с некоторой командой Python, эквивалентной mkfifo mypipe . Это дает псевдо-файл mypipe принадлежащий этому непривилегированному пользователю.

Поскольку PHP-скрипт запускается от имени другого пользователя, он не может немедленно записать в этот канал. Конечно, существуют различные способы решения проблемы. Тем не менее, я хочу избежать возможных ошибок безопасности.

Итак, мой вопрос в том, в какой каталог я должен поместить именованный канал (каталог сервера /var /www), какой владелец и разрешения он должен иметь, и, наконец, как и где я должен проверять (экранировать) контент, отправленный из PHP -скрипт к сервису.

1 ответ1

1

Здесь много вопросов, на некоторые из которых нет канонического ответа. Поэтому, пожалуйста, прочитайте это как мои 0,02 доллара, а не как "фундаментальную правду".

  • Проверка ввода: я считаю, что необходимо проверять ввод как можно раньше, в вашем случае это будет один раз сразу после запуска скрипта PHP, второй раз сразу после того, как скрипт python получит запрос через FIFO, и третий раз после того, как скрипт PHP получил ответ от FIFO.
  • Формат данных интерфейса (экранирование): Вы можете (и IMHO должен) попытаться использовать проверенную в бою библиотеку, чтобы помочь вам достичь этого: на ум приходит JSON, поскольку и PHP, и Python имеют хорошие библиотеки кодирования / декодирования. В этом случае я бы кодировал данные непосредственно перед записью в FIFO и декодировал их сразу после. Фактически, вы можете рассмотреть пару методов "send_to_interface" / "receive_from_interface" на каждой стороне, которая сочетает в себе кодирование / запись, соответственно. чтение / декодирование в атом. Если вы когда-нибудь захотите использовать другой механизм интерфейса, вам просто нужно создать новую пару пар без необходимости касаться остальной части кода.
  • Владение и привилегии FIFO: я бы пошел по пути создания группы, состоящей только из пользователя службы и пользователя www, а затем выполнил бы группу обслуживания chgrp servicegroup && chmod 660 на FIFO. Возможно, вы захотите исследовать использование сокета вместо FIFO - это облегчает ситуацию с привилегиями и подготавливает вас к ситуации, когда служба и веб-сервер не работают на одной машине. В зависимости от того, что делает ваш python-сервис, он также может окупиться, если запустит его в веб-слое и использует cURL на стороне PHP для доступа к нему. Инкапсуляция, предложенная в пуле, облегчает переключение между такими различными механизмами.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .