【问题标题】:Determining if request is made by server itself, for purposes of running cron jobs?确定请求是否由服务器本身发出,以运行 cron 作业?
【发布时间】:2014-07-18 21:33:48
【问题描述】:

所以我需要创建一个每 24 小时运行一次并发送一些电子邮件的 cron 作业。我需要以某种方式做到这一点,只有服务器能够运行它,并且它需要在 CodeIgniter 中。

假设我将它放在名为cron.php 的控制器中,我该如何让它只有服务器才能执行它。到目前为止,我已经想过在构造函数中放置这样的东西:

if($_SERVER['SERVER_ADDR'] != $SERVER['REMOTE_ADDR']){
    //kill the script, do not send emails
}

所以我的问题是,这似乎太简单了,这些值可以以某种方式被欺骗/操纵吗?很难做到吗?

有没有更好的方法来解决这个问题(不把它作为一个隐藏在公共网络根目录之外的独立程序?

【问题讨论】:

  • 我们能确切地知道为什么只有服务器应该运行它吗?可能还有其他/更好的解决方案......
  • 作为可能的方法之一,可以查看$argc/$argv全局变量
  • @Salketer,因为我想设置它让服务器每 24 小时运行一次 cronjob。如果除了服务器本身之外的任何人都可以运行脚本,那么有人可以访问:example.com/cron,并执行发送电子邮件的脚本。
  • 那么,最好的方法是在文件或数据库中使用时间戳。每次运行脚本时更新它,并确保仅在保存的时间戳是 24 小时前运行脚本。
  • 这其实很聪明。即使有人要运行它,他们也只能每 24 小时运行一次。简单,但真的很棒。

标签: php codeigniter cron


【解决方案1】:

添加一些“安全性”的方法是实现一种执行脚本所需的 API 密钥。

你的 cron 会获取一个类似的 URL

https://server/.../cron.php?key=<random string here>

确保您对密钥保密。

【讨论】:

  • 我也是这么想的。但是第 3 方不能监控流量,并查看进入服务器的请求吗?
  • 如果您通过 HTTPS 获取则不会。
  • 目前没有 HTTPS。但我们可能会得到它。我想我会在 IP 检查之上添加这个作为额外的措施:)
猜你喜欢
  • 2015-05-27
  • 2015-02-22
  • 2013-12-03
  • 2019-08-26
  • 2016-04-26
  • 2012-03-19
  • 2011-09-03
  • 2021-11-07
  • 2016-10-03
相关资源
最近更新 更多