pupuk / blog

My New Blog. Record & Share. Focus on PHP, MySQL, Javascript and Golang.
MIT License
9 stars 2 forks source link

如何完全彻底隐藏PHP? #27

Open pupuk opened 4 years ago

pupuk commented 4 years ago

有的时候,有个奇怪&莫名其妙的想法,就是不想让别人知道我们的网站是用什么语言开发的。 对,就是让别人(包含渗透者)不知道。。 java? PHP? Golang? Python...

1. URL

这块要隐藏的话,最简单的是在nginx的配置中index指令中,修改一下index文件,随便起个名子,然后对应的项目文件,把index.php改成一致的就行。比如: image

image

这样别人通过在URL后面补文件的方式就不行了。 他最多也是就是猜猜 index.php, route.php, home.php 怎么能猜到x82y9zux.php? 当然这块更高阶的方法,等下单独细说。

2. HTTP 响应头

3. COOKIE,SESSION,Storage等

4. PHP错误日志

解决: 我们生产环境的时候,忽略了notice,warning以上的错误记录到服务器的日志上,但是不应给抛到页面上来; 本项目:ini_set("display_errors", "Off"); 全局:vim php.ini  display_errors = Off 本地开发或者测试环境的时候,可以把错误通过HTTP抛出来,抛到页面上,方便早些发现错误,方便bug定位 本地,测试,生产可以配置error_reporting不同的级别,方便开发处理和线上运行;

5. 框架特征

pupuk commented 4 years ago

如何更巧妙地隐藏项目的入口文件index.php?

先直接看结论: image

娓娓道来: 这个是nginx的配置,我们在server作用域里面配置了index指令,如上图,让nginx先去找index.run, 找不到的话,再找index.html, 以此类推。 当用户访问:http://www.domain.com/ 的时候,nginx会去找 http://www.domain.com/index.run 我们再把index.run重写成index.php, 则后面匹配php的部分就能正常工作了。需要在项目入口创建一个index.run文件(随便什么文件,只要文件名是index.run就行),跟index.php同级的,这很重要 比如我就就在项目入口,用shell命令 touch index.run 创建一个新的空白文件

在重写之前,我们先拦截index.php, 那个if的意思是: ~*不区分大小写的正则匹配 index\.php是一个正则表达式,就是 index.php .是.的转义字符。 只要uri中包含了,不管大小写的index.php,我们就让nginx抛出404状态并结束该请求。 image

image

注: 1、使用index指令,当访问一个目录的时候,index指令会在$uri后面补充一个index.run,然后判断此文件是否存在,不存在则返回403(这也是上面提到很重要的原因),然后再执行下面的location,if匹配,最后才执行相关的代码;所以我们还是需要在相应目录下面建立一个index.run文件,哪怕是空文件,不然就会返回403 Forbidden。

如果框架还有多个,应用目录入口,则需要对应的入口 都放入一个空的index.run文件

2、只要uri里面包含index.php,拒绝掉,返回404; http://www.domain.com/index.php http://www.domain.com/abc/def/index.php 以上2个请求,都会返回404.

但是参数里面有php的不会被拦截返404,因为$uri不包含主机,不包含端口,也不包含参数。比如: http:www.domain.com/?k1=v1&k2=v2&k3=xyz.index.php&k4[name]=jack&k4[gender]=male

image Nginx系统变量,参见:http://nginx.org/en/docs/varindex.html

3、如过$uri里面包含了index.run,则把index.run替换成index.php,index.run前后的内容保持不变。

当然,更狠的是这种: image 这种只要uri中包含了 .php(不区分大小写),就让nginx抛404了