首页 > 解决方案 > 防止 Web 应用程序中 PHP 文件的直接 URL 访问

问题描述

应用程序中的所有 php 文件都可以通过 URL 直接访问。在我的 php 文件开头添加此代码适用于使用 POST 方法请求的少数文件:

if ( $_SERVER['REQUEST_METHOD']=='GET' && realpath(__FILE__) == realpath( $_SERVER['SCRIPT_FILENAME'] ) ) {

    die(header( 'location:/webapp/postings' ));
}

但是,我确实有一些通过 GET 方法请求的 php 文件,上面的代码对它们不起作用,因此我提供了以下代码:

if(!isset($_SERVER['HTTP_REFERER'])){
die(header('location:/webapp/postings'));    
}

我知道 HTTP_REFERER 是不可信的。还有其他选择吗?

有人可以告诉我一种防止直接 URL 访问的通用方法,而无需更改所有 php 文件中的代码。

注意:我的应用程序在 IIS 7.5 Web 服务器上运行。

标签: phpsecurityiis-7.5

解决方案


不要这样做:

public_html/
   includes/
       dont_access_me_bro.php
       ...
   index.php
   ...

改为这样做:

includes/
   dont_access_me_bro.php
   ...
public_html/
   index.php
   ...

解释

将源文件保存在文档根目录之外可确保用户无法通过更改其 HTTP 请求上的 URI 直接访问它们。这不能防止 LFI 漏洞利用。

要找出您的文档根目录,这个方便的 PHP 脚本可以提供帮助:

var_dump($_SERVER['DOCUMENT_ROOT']);

如果打印出来string (25) "C:\htdocs\www\example.com",您不想将文件存储C:\htdocs\www\example.comC:\htdocs\www\example.com.

如果你将用户提供的文件放在你的文档根目录中,你就会产生有人会直接从他们的浏览器访问它们的风险,如果 Apache/nginx/etc. 搞砸了,他们上传的文件可能会作为代码执行。

所以你希望你的文件在里面C:\htdocs\www\example.com\uploaded,你会想要像C:\uploads\example.com\.

这篇关于PHP中的安全文件上传的文章对此进行了深入介绍。


推荐阅读