PHP 服务挂了之后是不是就能查看. PHP 文件源码了?

2021-10-21 18:15:20 +08:00
 ysy950803

问个小白问题,有这么一个场景,假如我把.php 文件放在网站目录下,和 index.html 同目录,可通过浏览器访问的那种。 比如有一个 test.php 文件,里面有一些 PHP 代码,不渲染任何东西,当服务正常的时候,浏览器显示空白,这是正常情况。但如果 fpm 等相关服务挂掉了,是不是再访问就直接视为普通文本文件返回给浏览器了?这样就能看见源码了?

8682 次点击
所在节点    PHP
115 条回复
xmlf
2021-10-21 18:17:18 +08:00
你可以自己测试一下。
AoEiuV020
2021-10-21 18:17:19 +08:00
一般是 502,nginx 返回的,
ysy950803
2021-10-21 18:18:05 +08:00
@AoEiuV020 不是 Nginx 呢,是 Apache 。
ysy950803
2021-10-21 18:18:56 +08:00
@xmlf 哈哈哈害怕关了不会起了,不太熟,对 PHP 服务。
InDom
2021-10-21 18:20:55 +08:00
有可能会,但绝大多数配置正确的情况下并不会。

以 Nginx 来举例,如果你把 .php 配置到了 php-fpm 后,如果 fpm 挂了,它会尝试连接 fpm 失败后直接报错。

而不是把 php 文件作为文本来输出,如果你 .php 文件没有在 Nginx 内正确处理,就算 fpm 没挂也会作为文本输出。

综上,在 Nginx 作为 WebServer 的情况下,是否可能输出 php 文件源代码和 fpm 挂没挂基本没有直接关系,只和 Nginx 本身的配置是否有关。
ysy950803
2021-10-21 18:23:45 +08:00
@InDom 感谢解答。那这么说.php 文件放在网站目录还是有一定的安全风险。
demoshengxw
2021-10-21 19:26:56 +08:00
并不能,因为 php 部署只会开放入口文件。而且 nginx 会转发给 fpm,fpm 挂了那 nginx 收不到正确响应,就会吐给浏览器 5xx 错误
hxy100
2021-10-21 19:31:24 +08:00
并不会,了解下什么叫 MIME type,只要你 MIME type 配置正确(通常情况下以文件后缀名作为区分),无论服务怎么挂,是不会暴露源码的,除非你把.php 后缀的文件配置成 txt 形式( text/plain )加载,这样无论服务挂不挂都会暴露源码。
eason1874
2021-10-21 20:38:47 +08:00
php-fpm 挂了,nginx 就得不到 php-fpm 的响应,不会返回 php 文件内容,会报网关错误。

另外,机密信息不要硬编码在代码文件里,设置到环境变量,让代码读取
void1900
2021-10-21 20:40:05 +08:00
@hxy100 和 mime 没关系兄弟,你配成其他的 下下来一样打开就看见了,要转发给 fpm 才能避免
Rache1
2021-10-22 09:26:52 +08:00
Apache 跟 Nginx 不一样,Apache 是使用的 php_module,这里没有 fpm 。
elevioux
2021-10-22 09:32:25 +08:00
能查看与否和 php 本身无关,跟 web 服务器的设置有关。
正常的情况下,设置正确的 web 服务器遇到 php 文件都会交由 php-fpm 来处理。如果 php-fpm 挂了的话,nginx 直接报网关错误 502 。
不过,如果 web 服务本身就没有设置好,确实有可能把 php 直接打印出来,不过这种情况下,网站本身就不能正常打开。
dosgo
2021-10-22 15:16:54 +08:00
跟 web 服务器配置有关,当然现在可以在网站根目录留一个入口文件 index.php,剩下的可以不丢 web 目录
hxy100
2021-10-22 17:39:42 +08:00
@void1900 和 MIME 当然有关系,你说的这种情况就是没有给该拓展名的文件指定特定的 mime,默认的 mime 类型就是 application/octet-stream,这本质也是一种 MIME,所以 http 访问就当成附件让用户下载下来了。
hxy100
2021-10-22 17:45:29 +08:00
@void1900 另外,Apache,Nginx,php-fpm 解析文件时要么根据 MIME (后缀名也算),要么根据路径来判定。无论怎么绕,底层逻辑都离不开 MIME 。
void1900
2021-10-23 10:24:13 +08:00
@hxy100 年轻人 那我问你 mime 怎么配置能防止被下下来?
markgor
2021-10-23 15:51:28 +08:00
@void1900
常规场景下他说的没错,
apache 太久没碰不确认,但依稀记得是通过 AddType 添加 PHP 的 mime 进去的
nginx 的话就是看配置.php 后缀然后转发 php-fpm

当然也有场景是 php 直接监听端口,nginx 按目录请求转发到端口,这种就和 mime 没关系。


回到 LZ 的问题,
Nginx 通过 phpfpm 转发的话 fpm 挂了,那么会产生 5XX 错误,不会反回源码;
一般反回源码的情况是 Nginx/Httpd 没配置好的时候(即没把解析 PHP 配置好),就会出现反回源码。
void1900
2021-10-24 21:43:35 +08:00
@markgor 所以都是要转发给 fpm 或者其他服务,mime 其实只影响,响应的 header 里的 content-type ,不要混淆了
markgor
2021-10-25 08:50:59 +08:00
@void1900
换种说法可能更容易理解;
nginx/httpd 如何知道这个文件需要转发给 phpfpm 还是直接读取返回呢?
这时候一般就几种方式;
1 、根据后缀来判断是否 php 文件;(其实就是#15 说的“解析文件时要么根据 MIME (后缀名也算)”
2 、根据目录转发请求;这种就和你所说的,和 mime 毫无关联
3 、全部请求转发,相当于 nginx 进行反代或均衡或缓存等;如 webman 框架,框架自身自带处理静态文件,上级的 nginx 做负载。
hxy100
2021-10-25 10:05:18 +08:00
@void1900 配置一个任意的已知解析逻辑处理程序即可(强调,这些操作都是 MIME Type 强相关,而不是不相关),php-fpm 算是其中一种,还有其他 cgi 模式的程序也可以作为后端处理,比如,你把 hello.php 写满 Python 代码交给 python.exe 去执行也是 OK 的,或者把图片的二进制代码放到 hello.php 里面,Apache 或 Nginx 设置 MIME 为图片类型输出处理也可以,不过这种情况服务器端要输出一个图片类型的 http Header 来告诉浏览器这是一张图片,浏览器端就能正确渲染。对于不认识或者不知道怎么处理的文件形式( MIME Type ),Apache 和 Nginx 的默认行为都是 Raw 形式直接输出,除非你做了限制和特殊配置。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/809602

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX