Tubulação nomeada para comunicação entre processos [fechada]

0

Eu quero usar um pipe nomeado para comunicação entre um script de servidor PHP e um serviço, ou seja, um processo (um script Python) escutando na outra extremidade do canal. Este serviço é executado intencionalmente sob um usuário não privilegiado e também cria o canal com algum comando Python equivalente a mkfifo mypipe . Isso gera um pseudo arquivo mypipe de propriedade desse usuário não privilegiado.

Como o script PHP é executado como um usuário diferente, ele não pode gravar nesse canal imediatamente. Claro que existem várias maneiras de resolver o problema. No entanto, quero evitar possíveis armadilhas de segurança.

Então, minha pergunta é em qual diretório devo colocar o pipe nomeado (diretório do servidor é / var / www), qual proprietário e permissões ele deve ter e, finalmente, como e onde devo validar (escape) o conteúdo enviado do script PHP para o serviço.

    
por highsciguy 15.09.2018 / 14:19

1 resposta

1

Há muitas perguntas aqui, algumas das quais não têm uma resposta canônica. Então, por favor, leia isto como meu $ 0.02, não como uma "verdade fundamental".

  • Validação de entrada: Eu considero diligente validar a entrada o mais cedo possível, no seu caso isso seria uma vez imediatamente após o script PHP ser iniciado, a segunda vez imediatamente após o script python ter recebido o pedido via o FIFO, e a terceira vez após o script PHP ter recebido a resposta do FIFO.
  • Formato de dados de interface (escape): Você pode (e IMHO) tentar usar uma biblioteca testada em batalha para ajudá-lo: JSON vem à mente, já que PHP e Python têm boa codificação / decodificação bibliotecas. Nesse caso, eu codificaria os dados imediatamente antes de gravá-los no FIFO e decodificá-los imediatamente depois. De fato, você pode querer considerar um par de métodos "send_to_interface" / "receive_from_interface" em cada lado, que combina codificação / escrita resp. leitura / decodificação em um átomo. Se você quiser usar um mecanismo de interface diferente, basta criar um novo par de pares sem precisar tocar no restante do código.
  • Propriedade e privilégios do FIFO: Eu seguia a rota de criar um grupo consistindo apenas no usuário do serviço e no usuário www, então faça um chgrp servicegroup && chmod 660 no FIFO. Você também pode querer pesquisar usando um soquete em vez de um FIFO - isso facilita a situação de privilégios e prepara você para uma situação em que o serviço e o servidor da Web não são executados na mesma máquina. Dependendo do que seu serviço python faz, ele também pode pagar para executá-lo em uma camada da web e usar cURL no lado do PHP para acessá-lo. O encapsulamento sugerido na bala antes facilita a troca entre mecanismos tão diferentes.
por 15.09.2018 / 14:38

Tags