允许通过javascript请求PHP文件,但不能直接从浏览器请求

时间:2011-10-14 19:26:42

标签: php javascript ajax

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

有没有办法可以确保upload_a_file.php没有直接在浏览器中加载?

我尝试将upload_a_file.php放在我的public_html文件夹上。但似乎无法通过javascript加载upload_a_file.php。

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

../upload_a_file.php

甚至可以使用javascript访问public_html上面的文件吗?

6 个答案:

答案 0 :(得分:4)

JS无法访问您自己作为用户无法访问的任何服务器上的任何内容。如果文件位于站点的文档根目录之外,则用户或JS无法访问该文件。想象一下,如果JS能够神奇地绕过服务器上的访问限制并再抓住它,那么Web将会是一个有趣的地方。 “噢,我打算抓住这个银行的帐户列表,但它不在文档根目录中。好东西我有Javascript,它可以做任何事情!”

就像24的每一集一样,“修补子网”可以神奇地绕过任何防火墙并从甚至不在线或(更好)甚至没有通电的机器获取数据。令人惊奇的事情,那些子网。

答案 1 :(得分:2)

您可以检查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   
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

不,不是直接的。您可以调用其他脚本(PHP或其他),这些脚本将使用include“调用”您的脚本,或者例如使用fopencurl

答案 4 :(得分:0)

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

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

但是,为了安全起见,不应该依赖此方法,因为可以使用正确的工具欺骗引用者。

答案 5 :(得分:0)

由于直接浏览器访问页面是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();
}