gpt4 book ai didi

php - 你如何检查服务器是否正在执行 PHP 脚本?

转载 作者:行者123 更新时间:2023-12-03 23:31:11 24 4
gpt4 key购买 nike

我正在运行一个需要将数据写入缓存的 cronjob。我想把这个 cronjob 放在我的私有(private)文件夹中,但是,即使在 CHMOD 将缓存文件夹放入私有(private)文件夹之后,它也没有获得写入权限。这似乎是某种 plesk 功能。

所以,现在我已将 cronjob 放在公用文件夹中。但是,我需要确保只有服务器才能执行脚本。 cronjob 顶部的以下内容怎么样?

if ($_SERVER['SERVER_ADDR'] != $_SERVER['REMOTE_ADDR']) die();

这似乎可行。但是,它是否不可利用,例如。用户可以将他的 remote_addr 操纵到我的服务器吗?或者有更好的方法来检查这个吗?

我遇到的另一个问题是上面的代码返回了 2 个警告,即使它看起来确实有效:

PHP Notice:  Undefined index:  SERVER_ADDR in ... on line 2
PHP Notice: Undefined index: REMOTE_ADDR in ... on line 2

知道这是什么原因吗?

最佳答案

通过控制台而不是网络服务器执行脚本。

cron 可能看起来像这样:

*/5 * * * * php -f /path/to/cron.php

然后文件可以这样做:

cron.php:
<?php

if ( array_key_exists('REMOTE_ADDR', $_SERVER) )
die("Can only be run from the command line!");

这将保证它仅由服务器运行。

根据评论进行编辑

一般来说,您无法访问私有(private)文件夹内的公共(public)文件夹,如果您无法在 Web 根目录之外添加新目录,则您的缓存目录将不得不以其他方式进行保护。

我假设您的所有文件都在网络根目录中,即:/home/site/publichtml。将其替换为您的目录。

创建一个新目录 /home/site/publichtml/.cache。将以下内容添加为 .htaccess 文件:

Deny from all

现在您的脚本应该能够从文件系统访问该文件夹,但无法通过网络服务器访问它。

如果你可以在服务器上设置一个 cron 作业(通过 web admin 或其他方式,听起来你可以)像上面那样做,即:使用 php -f/home/site/publichtml/cron.php 作为命令,并包含对数组键的检查。

或者,您可以这样检查:

if ( !isset($_SERVER['argc']) )
die("Must be run from the command line!\n");

$_SERVER['argc'] 仅在从命令行执行脚本时设置。

如果您可以将 cron 脚本保留在 Web 根目录之外,那很好。如果不是,那应该是安全的。

最后,要删除 E_NOTICES,将其添加到 cron.php 的顶部:

error_reporting(E_ALL ^ E_NOTICE); // Turn off notices

error_reporting(0); // Hide all error reporting

关于php - 你如何检查服务器是否正在执行 PHP 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/557653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com