我正在运行apache2的Ubuntu 12.04服务器上使用CakePHp 2.3.8编写的应用程序。我想创建一个cron作业来处理每个月第一天发生的情况。每个月都会向用户提供他们可以使用的一定数量的特定任务,如果他们超过此限制,他们将根据他们所经过的任务数量收取费用。我想创建一个cron工作来实现这一目标,但我担心的是有人访问CakePHP操作的URL以执行此特定任务,然后可以启动财务事务。
我通过Google阅读了this关于cron职位的文章,但我不太清楚我是否理解他们对保护网址的看法。
A cron handler is just a normal handler defined in app.yaml. You can prevent users
from accessing URLs used by scheduled tasks by restricting access to administrator
accounts. Scheduled tasks can access admin-only URLs. You can restrict a URL by
adding login: admin to the handler configuration in app.yaml.
如果访问的URL由我的CakePHP应用程序提供支持,cron如何确定管理员是否正在访问它?或者我应该编写一个独立的PHP(或任何语言)文件来处理这些cron作业,并且在该文件中它可以与cron“交谈”以确定管理员是否正在访问它?
说我确实使用CakePHP来驱动它。在URL中使用长字符串是否安全(或者说是必要的),以便基本上没有人会猜到它,并使它与代码中的字符串匹配?
类似于www.mysite.com/url/to/task/jdbpojzm2929qJjfwX82j3zze9iwj919jsfjmmwmwi
然后是我的代码
function cron_called_function($code){
if($code == "jdbpojzm2929qJjfwX82j3zze9iwj919jsfjmmwmwi"){
//do task
}
}
答案 0 :(得分:1)
无法通过网址访问非公开会员功能。 Cake约定说方法的前缀是下划线。
private function _cron_called_function() { // or protected
// do task
}
答案 1 :(得分:0)
永远不要使用网址来执行这类任务,这是完全错误的,不安全的,可能导致您的脚本死亡或服务器不再响应。
假设您有10000个用户并且脚本运行时间为30秒,脚本很可能在完成之前超时,并且您最终只有部分用户正在处理此时。具有高或无限量脚本运行时的另一个方案可以锁定您的服务器。根据脚本或数据库操作,它可能会导致服务器负载过高,而在脚本运行时使用该站点的用户将遇到一个非常慢的非响应站点。
此外,您无法真正在单个URL上运行循环,您可以从一个URL重定向到另一个执行限制和偏移的操作,以模拟100000个用户的循环。如果你没有遍历记录但同时获取所有100000,那么由于内存不足,你的脚本很可能会死掉。
您应该创建一个shell 来处理循环中的用户,并且始终只处理批量,例如10,50或100个用户。
执行shell时,我建议将它与“nice”命令一起使用,以限制允许shell使用的CPU时间,以防止shell占用100%的CPU,以保持站点响应。
你也不能与cron“交谈”,cron只不过是定时执行某事。您无法真正指定用户,除非您以允许您将特定用户作为参数传递的方式实现shell,例如“cake transactions --user admin”。如果您要使用特定系统用户执行shell,请参阅How to specify in crontab by what user to run script?。
答案 2 :(得分:-2)
有很多方法可以防止任何人购买自己的服务器访问网址。没有一个是完美的,但有些比其他更好。
如果可能,请将cron指向一个在网络上看不到的页面。这可能是位于public_html heirarchy上方的页面。在服务器内,此页面可以访问,但无法通过URL访问。这是IMO的最佳选择。
另一种选择是将页面限制为服务器的ip地址以及请求中的其他值,例如post或querystring变量。
当然,你已经发现你可以在网址中加入一个冗长的秘密或令牌,其长度足以使其难以猜测或不可能猜到。
您还可以ping一个页面,该页面反过来使用CURL以管理员身份登录并运行页面 - 在某些方面,这是最能反映您与网站交互方式的选项。您可以创建一个名为“cron”的管理员,然后就会像其他管理员一样记录“cron”的活动。 http://php.net/manual/en/book.curl.php