我曾多次尝试(以不同的方式)询问这个问题,但从未得到明确、真正的答案,甚至似乎根本没有得到任何理解。
多年来这一直是我担心的问题:
出于实际和逻辑的原因,我不得不相信一些第三方 PHP 库。这些脚本的安装、更新和管理均通过 进行Composer
,并且位于 中C:\PHP-untrusted-external
,与我自己的 PHP 脚本(位于 中)完全分开C:\PHP-my-own
。
中的脚本C:\PHP-my-own
包含并使用了中的库C:\PHP-untrusted-external
。
由于任何人(尤其是我)都不可能审查所有第三方代码和所有更新,因此我正在寻找某种方式来“保护”或“沙盒化”它们,即使只是部分的。
基本上,我担心有一天,更新会做出如下编辑:
unlink('C:\');
或者:
phone_home_to_hacker_server($contents_of_my_harddrive);
如果发生这种情况,脚本会顺利运行并执行这些操作。没有什么可以阻止它们这样做。
真的没有办法在php.ini
配置文件中指定吗,例如:
security.sandbox_dir = "C:\PHP-untrusted-external"
或者:
security.refuse_network_connections_for_dir = "C:\PHP-untrusted-external"
security.refuse_disk_io_for_dir = "C:\PHP-untrusted-external"
... 或者某物像那样?
我不明白Docker。我试过无数次了,但对我来说毫无意义。我不想要 Docker。我不想处理容器。更正:我不能处理它。我试过,但不明白。好几次。
我只是希望 PHP 本身能够支持这一点,这对我来说似乎非常合理。您觉得这不合理吗?
“在某个时候,你必须信任其他人”这句话太过笼统/模糊,不适合在这里使用。这是在回避问题。我根本不信任别人,而且理由充分。我们(显然)只是坐在那里等待灾难发生,这似乎很愚蠢。至少如果我可以阻止第三方脚本对文件系统和网络进行任何操作,这将在某种程度上缓解这个问题。这仍然不会使脚本无法就它们返回给我的数字/数据撒谎,但至少它们不能直接“打电话回家”或删除随机文件。
答案1
PHP 确实提供了这些可能性。以下摘自 php.ini:
; Directives following the section heading [PATH=/www/mysite] only
; apply to PHP files in the /www/mysite directory.
; open_basedir, if set, limits all file operations to the defined directory
; and below. This directive makes most sense if used in a per-directory
; or per-virtualhost web server configuration file.
; http://php.net/open-basedir
;open_basedir =
; This directive allows you to disable certain functions for security reasons.
; It receives a comma-delimited list of function names.
; http://php.net/disable-functions
;disable_functions =
; This directive allows you to disable certain classes for security reasons.
; It receives a comma-delimited list of class names.
; http://php.net/disable-classes
;disable_classes =
但这些似乎都无法防范黑客,更不用说那些你允许在你的系统上安装程序的人了。我想知道,如果你知道这些,你这么多年来会睡得更安稳吗?苏霍辛或最近鼻塞