我想使用命名管道在 PHP 服务器脚本和服务之间进行通信,即在管道另一端监听的进程(Python 脚本)。此服务有意在非特权用户下运行,并使用一些相当于的 Python 命令创建管道。这会产生一个由此非特权用户拥有的mkfifo mypipe
伪文件。mypipe
由于 PHP 脚本以不同的用户身份运行,因此它无法立即写入该管道。当然,有多种方法可以解决这个问题。但是,我想避免可能的安全隐患。
所以,我的问题是我应该将命名管道放在哪个目录中(服务器目录是 /var/www),它应该具有哪个所有者和权限,最后,我应该如何以及在何处验证(转义)从 PHP 脚本发送到服务的内容。
答案1
这里有很多问题,其中一些问题没有标准答案。所以请将此视为我的一点见解,而不是“基本事实”。
- 输入验证:我认为尽早验证输入是明智的,在您的情况下,这将是在 PHP 脚本启动后立即验证一次,在 python 脚本通过 FIFO 接收到请求后立即验证第二次,在 PHP 脚本收到来自 FIFO 的答复后验证第三次。
- 接口数据格式(转义):您可以(而且在我看来应该)尝试使用经过实战检验的库来帮助您实现这一点:我想到的是 JSON,因为 PHP 和 Python 都有很好的编码/解码库。在这种情况下,我会在将数据写入 FIFO 之前立即对其进行编码,然后立即对其进行解码。事实上,您可能需要考虑在每一侧使用“send_to_interface”/“receive_from_interface”方法对,将编码/写入和读取/解码组合成一个原子。如果您想使用不同的接口机制,只需创建一对新的对,而无需触及其余代码。
- FIFO 所有权和特权:我会创建一个仅由服务用户和 www 用户组成的组,然后对 FIFO 进行操作
chgrp servicegroup && chmod 660
。您可能还想研究使用套接字而不是 FIFO - 这可以简化权限情况,并为您准备服务和 Web 服务器不在同一台机器上运行的情况。根据您的 Python 服务的功能,在 Web 层运行它并在 PHP 端使用 cURL 访问它也可能有所回报。前面建议的封装使得在这些不同机制之间切换变得容易。