阻止Web应用程序中PHP文件的直接URL访问

时间:2018-08-29 13:35:11

标签: php security iis-7.5

应用程序中的所有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服务器上运行。

1 个答案:

答案 0 :(得分:1)

不要这样做:

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\的文件。

本文在secure file uploads in PHP上对此进行了详细介绍。