Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.htaccess只允许通过Ajax和Cron调用php脚本_Php_.htaccess - Fatal编程技术网

.htaccess只允许通过Ajax和Cron调用php脚本

.htaccess只允许通过Ajax和Cron调用php脚本,php,.htaccess,Php,.htaccess,我需要允许php脚本只通过Ajax和Cron调用,而不是通过浏览器中的地址调用 在F12中,所有的php脚本都是可见的,任何用户都可以调用php脚本,如website.com/file.php您不能调用。脚本不知道如何调用它们;他们只知道web服务器调用了它们 web服务器不知道调用的是谁,只知道HTTP或HTTPS端口上有请求(cron CLI是一个例外,请参见下文) 您最多只能验证以下两个标题: HTTP_USER_AGENT either empty or fille

我需要允许php脚本只通过Ajax和Cron调用,而不是通过浏览器中的地址调用


在F12中,所有的php脚本都是可见的,任何用户都可以调用php脚本,如
website.com/file.php
您不能调用。脚本不知道如何调用它们;他们只知道web服务器调用了它们

web服务器不知道调用的是谁,只知道HTTP或HTTPS端口上有请求(cron CLI是一个例外,请参见下文)

您最多只能验证以下两个标题:

HTTP_USER_AGENT            either empty or filled
HTTP_X_REQUESTED_WITH      either 'XMLHttpRequest' or not (possibly empty)
结果将是:

UA empty, XRW empty              cron or a browser faking cron
UA "Lynx" or "wget", XRW empty   cron calling wget or lynx (or curl?)
UA empty, XRW filled             some prankster messing with you (*)
UA filled, XRW filled            AJAX call
UA filled, XRW empty             browser
(*)或某些“隐私”客户端防火墙删除用户代理头

但请记住:

  • 浏览器可以冒充cron(例如,使用ModifyHeaders插件)
  • cron可以冒充浏览器(为什么?不知道。但这是可能的)
  • 任何人都可以伪造任何东西(例如通过
    curl
你最好检查一下

HTTP_REMOTE_ADDR
通过cron CLI调用时未设置,设置后,应为您授权的服务器的IP地址,如Web服务器所示

另一种可能是使用身份验证,例如通过质询/响应,在调用脚本和被调用的PHP程序之间共享秘密

其他可能性 我在这里孤注一掷,想象你的处境是这样的:

您有一个脚本,需要定期调用,或者当用户通过AJAX执行某些操作时调用,但不要太频繁(可能是因为计算成本太高)。因此,您每天从cron调用脚本一次,当某些用户查看页面时,但不希望用户看到调用并能够随意复制它,甚至可能是从不同的浏览器或他们自己的cron

一个简单的解决办法是反过来做。您可以在会话中设置变量:

// AJAX calls are only allowed every 600 seconds PER EACH USER
// (you should verify that a login exists)
if (array_key_exists('ajax', $_SESSION)) {
    if (time() - $_SESSION['ajax'] < 600) {
        return;
    }
}
$_SESSION['ajax'] = time();
//每个用户每600秒只允许进行一次AJAX调用
//(您应该验证是否存在登录名)
如果(数组\键\存在('ajax',$\会话)){
if(time()-$\u会话['ajax']<600){
返回;
}
}
$\u会话['ajax']=time();
或者,您可以使用以下文件限制调用:

if (file_exists('call.txt')) {
    if ((time() - filemtime('call.txt')) < 600) {
        return;
    }
}
touch('call.txt');
if(文件_存在('call.txt')){
如果((time()-filemtime('call.txt'))<600){
返回;
}
}
touch('call.txt');
现在,无论以何种方式(除了cron CLI,它几乎肯定会在另一个目录中创建call.txt),脚本的调用频率都不能超过每600秒(10分钟)调用一次


您可能还可以将脚本输出存储在文件中,如果文件不早于给定值,则可以读取该文件的内容。因此,您可以发出一千个AJAX调用,但只有第一个调用将执行任何实际工作-另一个将等待锁定的文件,然后读取缓存副本。这比看起来更复杂,因为需要处理可能几个并行调用之间的竞争条件。

可能重复的查看我的问题没有答案。我需要允许Ajax和Cron访问这些文件非常感谢,但我仍然不知道该怎么做)你需要这个检查做什么?是为了安全吗?也许你想达到的目标可以通过另一种方式实现。例如,为什么需要从cron和AJAX访问相同的脚本?看起来很奇怪。所有的.php文件都可以在F12
XHR
选项卡中看到。所以,用户可能只是为了好玩而点击php文件并调用它。顺便说一句,这也是一个问题-如何防止它们可见?cron每天都调用脚本。但是,用户可以自己调用它,单击按钮您的更新不会回答我的问题:我想阻止用户通过浏览器地址选项卡调用我的php文件,仅此而已)