应用程序中的所有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服务器上运行。
答案 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.com
或C:\htdocs\www\example.com
的任何子目录中。
如果将用户提供的文件放在文档根目录中,则可能会导致有人直接从其浏览器以及Apache / nginx / etc访问这些文件。搞砸了,他们上传的文件可以作为代码执行。
因此,您不不希望您的文件位于C:\htdocs\www\example.com\uploaded
内,而您想要类似C:\uploads\example.com\
的文件。
本文在secure file uploads in PHP上对此进行了详细介绍。