php - 防止 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 服务器上运行。
解决方案
不要这样做:
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\
.
这篇关于PHP中的安全文件上传的文章对此进行了深入介绍。
推荐阅读
- java - 如何在spring boot中使用分页对存储库实体进行排序
- python - 以后有没有办法在你的代码中使用你的代码输出结果?
- glsl - 为什么纹理函数不知道?我正在使用处理
- python - 图表没有被清除,而是继续添加到 tkinter 中现有图表的下方
- java - 如何在 ivy 中强制执行 HTTPS?
- python-3.x - 如何解析 eml 文件并提取元数据信息
- reactjs - 使用 Gatsby + Bootstrap React + scss 模块设置卡片内容仅在悬停时可见
- time-series - 当基本事实接近于零时,LSTM 无法很好地预测
- vba - 通过 word vba 将电子邮件发送到 Outlook 时丢失格式
- android - 如何跨 Fragment 跟踪数据变化?