如何查找生成XMLHttpRequest的页面的文件名?

时间:2014-08-16 15:21:53

标签: javascript php ajax xmlhttprequest

我有一个页面可以将XMLHttpRequest设置为php文件。在这个php文件中,我需要提出请求的页面的文件名。

                           XMLHttpRequest
variable-page-name.html -------------------> request-processor.php
                                        (needs 'variable-page-name.html')

编辑:我有一个要求:我不能在发出请求的页面上使用php。文件名必须在请求页面的javascript中或在processor.php中获取

到目前为止,我一直在使用php文件中的$_SERVER['HTTP_REFERER']。我意识到javascript也可能传递包含文件名的变量。让我再说一遍,我不能在请求页面上使用php。

它是一个非常简单的CMS的一部分,它通过javascript生成变更请求。

我对你的想法感兴趣:

  • 如何获取文件名?
  • 是否可以从“不可伪造”的来源获取文件名? (HTTP_REFERER基于标题,如果我没有记错的话,可以由用户修改。)
  • 否则,最好是依靠javascript或php吗?
  • 关于安全问题,您是否有关于如何验证此文件名变量的建议?

1 个答案:

答案 0 :(得分:1)

  

是否可以从“不可伪造的”'中获取文件名?源?

排序,您不能信任来自客户端的任何内容,但您可以生成一次性密钥并让它们使用这些作为文件名

  

最好是依靠javascript或php吗?

您需要同时使用两者, JavaScript 默认情况下不会发送比引用者更多的内容,但这并不意味着您无法添加对请求的自定义标头或查询

  

关于安全问题,您是否有关于如何验证此文件名变量的建议?我怎样才能限制可以造成的伤害?限制可能的目录。

  • 要求客户端已登录;在任何事情发生之前使页面死亡
  • 发送一次性密钥,以便在使用密钥后,必须刷新页面(或者需要ajax调用)才能获得新密钥
  • 速率限制页面可以被称为宠物客户端的频率,通过查看时间完全由服务器端执行
  • 将上传目录设置为403 Forbidden,通过另一个读取文件内容的脚本向其发出所有请求(即确保服务器不执行上传的文件)

这是我正在玩的东西,因为stackoverflow处于只读模式,你可能想要使用完全不同的方法

var xhr = new XMLHttpRequest();
xhr.open(method, url); // e.g. "POST", "/upload.php"
xhr.setRequestHeader('one-time-key', keyForThisRequest);
xhr.send(data); // e.g. a FormData instance

然后,例如(取决于php版本等)

if (isset($_SESSION["is_admin"])) {
    $headers = apache_request_headers();
    if (isset($_SESSION["one-time-key"]) && $headers["one-time-key"] == $_SESSION["one-time-key"]) {
        // etc
    } else {
        die();
    }
}