【问题标题】:Disallow direct access while allowing ajax call [duplicate]在允许ajax调用时禁止直接访问[重复]
【发布时间】:2019-03-15 09:55:48
【问题描述】:

我使用此代码禁止直接访问 php 文件

if (__FILE__ == $_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF']){
  die("Direct access forbidden");
}

我的问题是我需要这样调用 php

xmlhttp.open("GET","getverse.php",true);

它还会返回Direct access forbidden 错误。

如何在不允许从浏览器直接访问的同时允许对 php 文件的调用?

谢谢

【问题讨论】:

  • 您可以建立某种身份验证协议,但最终的 HTTP 请求是 HTTP 请求。如果您的网站响应 ajax (HTTP) 请求,它可能会被欺骗以响应 Internet 上任何 HTTP 客户端的请求。
  • 考虑一下您要执行的操作...您希望在允许访问的同时禁止访问。是时候重新考虑您要解决的问题了。用户是否有权访问此服务?您实际上试图阻止用户做什么?为什么?
  • @David,我想我已经提到了不同的场景。 xmlhttp.open("GET","getverse.php",true); 正在从我想要允许的 javascript 文件中调用。不允许从浏览器地址栏直接访问 php 文件。我希望有一些方法可以使这两个从技术角度有所不同,并禁止直接浏览器访问
  • @Wayne:但是为什么?你想阻止什么?考虑基本目标,而不是当前尝试的实现。那是什么目标?这种尝试很有可能不是实现该目标的正确方法。但你问的不是目标,而是尝试。
  • @David,我想我明白你的意思。谢谢。这是一个非常好的观点。

标签: javascript php ajax


【解决方案1】:

不确定它只是一个 PHP 文件,或者您使用的是任何框架或 CMS。

不过你可以试试,

if (__FILE__ == $_SERVER['DOCUMENT_ROOT'].$_SERVER['PHP_SELF'] && !isset($_GET['ajax'])){
  die("Direct access forbidden");
}  

使用

调用此文件
xmlhttp.open("GET","getverse.php?ajax=1",true);

【讨论】:

  • 这根本不安全,我可以在浏览器中添加 ?ajax=1 并获取文件
  • 就我目前的目的而言,这对我很有帮助。我会接受它作为答案
【解决方案2】:

你可以这样做:

if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {...}

但请记住,无论如何你都可以使用 cURL 来欺骗任何标题:

curl_setopt($ch,CURLOPT_HTTPHEADER,array("X-Requested-With : XMLHttpRequest"));

(但至少它应该注意直接在浏览器中访问 PHP 文件)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2020-05-04
    • 2012-06-04
    • 2010-12-17
    • 1970-01-01
    • 2014-01-22
    • 2014-01-31
    相关资源
    最近更新 更多