允许PHP文件被javascript请求,而不是直接从浏览器请求

Allow PHP file to be requested by javascript but not directly from browser

本文关键字:请求 浏览器 文件 PHP javascript 允许      更新时间:2023-09-26

我使用一个jquery脚本,用ajax和PHP上传文件。它向upload_a_file.php发送请求,然后上传文件。

是否有一种方法可以确保upload_a_file.php不直接加载在浏览器中?

我试着把upload_a_file.php放在我的public_html文件夹上面。但似乎无法让javascript加载upload_a_file.php.

这是我在javascript中使用的url格式来请求upload_a_file.php:

../upload_a_file.php

它甚至可以访问文件上面的public_html与javascript?

JS不能访问服务器上的任何你自己作为用户不能访问的东西。如果文件位于站点的文档根目录之外,则用户或JS无法访问该文件。想象一下,如果JS可以神奇地绕过服务器上的访问限制并获取更多内容,web将会是一个多么有趣的地方。"啊,我本来想要获取这家银行的账户列表,但它不在文档根目录中。好在我有Javascript,它可以做任何事情!"

就像24的每一集一样,"打补丁进入子网"可以神奇地绕过任何防火墙,从甚至没有在线或(更好的是)甚至没有通电的机器上获取数据。这些子网真是太神奇了

您可以检查HTTP报头X_REQUESTED_WITH是否存在,并且其值为XMLHttpRequest。这不是非标准的头文件,但是大多数JavaScript框架(包括jQuery、Prototype和mootools)都遵循这个约定。

在PHP中可以访问$_SERVER['HTTP_X_REQUESTED_WITH'];

例如:

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
{
 // do something   
}

javascript正在浏览器中运行。它通过浏览器发出请求。所以,不,没有办法通过ajax访问页面,但不是直接从浏览器

不,不直接。你可以调用其他脚本(PHP或其他),将要么"调用"你的脚本与include或例如与fopencurl

没有东西可以访问public_html以上的文件,因为web服务器不会为它们提供服务。这样做会有明显的安全漏洞,比如可以查看文件系统上的任何文件。

如果你想限制文件只能通过javascript加载,我认为你会想看看php中的$_SERVER['HTTP_REFERER']变量。这应该设置为javascript被正确访问时所处的页面。如果它为其他值或为空,则用户正在以其他方式访问它。

但是,使用这种方法不应该依赖于安全性,因为引用者可以被正确的工具欺骗。

由于浏览器对页面的直接访问是PHP的GET请求,因此这里有一个非常基本的访问控制方法,以防止某人无意中直接访问upload_a_file.php:

在jquery脚本中,使用类型为"POST"的ajax请求:

$.ajax({
    url:      "../upload_a_file.php",
    dataType: "json",
    type:     "POST"
});

并在你的upload_a_file.php中使用它:

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    // upload a file
} else {
    header("Location: http://example.com/myPublicUploadPage.php");
    die();
}