使用Zend Framework安全地运行Cron Jobs

Lot*_*har 7 php cron zend-framework

我已经看过很多关于cron和ZF的帖子,但大多数解决方案都让这项工作可以让公众触发.

如果你想设置一个只能由cron运行的动作怎么办?不是某个匿名用户而是某个必须登录的人?

我正在使用的解决方案涉及将一个文件放在我的web根目录之外,让它足够引导ZF以使用我需要的东西(比如,我不需要视图),然后从cron中找到它.我的问题是,这是一种"最佳实践"方式吗?如果您需要通过Web访问代码但仍需要阻止随机用户查找和运行代码,该怎么办?

为了说明,这里是我正在做的(有效)从php命令行运行的cron作业,并在同一台服务器上,如下所示:

* 10 * * * php /Apps/ZF/cronjobs/crontest.php
Run Code Online (Sandbox Code Playgroud)

Webroot是: /Apps/ZF/someproject/

crontest.php:

<?php
ini_set('include_path', ini_get('include_path') . ':/Apps/ZF/someproject/library');

define('APPLICATION_PATH','/Apps/ZF/someproject/application');
define('APPLICATION_ENVIRONMENT','test');

//Include the loader (for loading ZF resources)
require_once 'Zend/Loader.php';

//Include the model (to access the Sites model in this case)
require_once(APPLICATION_PATH . '/models/Planets.php');

Zend_Loader::registerAutoload();

$configuration = new Zend_Config_Ini(
    APPLICATION_PATH . '/config/config.ini',
    APPLICATION_ENVIRONMENT
);

// DB adapter
$dbAdapter = Zend_Db::factory($configuration->database);

// DB table setup
Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter);

// Whatever code we want to run... 
$test = new Model_Planets();

$test->fetchEntries();

Zend_Debug::dump($test);
?>
Run Code Online (Sandbox Code Playgroud)

所以,正如我所说,这是有效的,所以我不是在找人给我写一个解决方案......只是好奇这样做"更好".此外,如果我需要通过网络访问它但仍想保持它只能由cron运行怎么办?如何使它更灵活(因为在这里我很难编写一些我怀疑可以变得更有活力的路径)?

我假设我可以列出允许的服务器列表,然后测试一下$_SERVER['REMOTE_ADDR']

你们都觉得怎么样?建议?我一个人工作,所以我没有同事在这方面寻求帮助......在某种程度上,我是我的同事.

irc*_*ell 8

一种方法是设置环境变量.

所以在你的crontab中

SCRIPT_RUN_ENV=cron
* * * * * foo.php // Whatever your line is
Run Code Online (Sandbox Code Playgroud)

然后,在应用程序中,只需检查:

if (get_env('SCRIPT_RUN_ENV') != 'cron') {
    echo "Program cannot be run manually\n";
    exit(1);
}
Run Code Online (Sandbox Code Playgroud)

现在,任何人都可以将他们的环境变量设置为该值并成功运行cron,但它应该停止琐碎的运行(或意外)...

但是请注意,任何能够在服务器上编辑环境变量的人都可以执行它,因此没有真正的方法可以从这个角度保护它(至少没有自动化)...还值得注意的是你不能注入环境变量通过HTTP.

  • 只有请求的代码属于Web根目录.如果Web服务器无法使用它,请将其移到Web根目录之外(包括框架库等).只有要提供给浏览器的内容才属于... (2认同)
  • @Shehi:我认为它使它更具可移植性,因为它不依赖于你无法控制的SAPI实现细节.至少有一个简单的环境变量,你可以完全控制它(它真的是100%便携).更不用说一个优秀的程序员使用他/她可用的工具来解决具有语义意义的庄园中的问题.如果要分发这个,我会同意这样做并不好.然而,考虑到一次性实施,我不认为这有点脏,但又一个坏... (2认同)