运行涉及金融交易的cron作业的安全问题


Security concerns running cron jobs with financial transactions involved

我正在运行apache2的Ubuntu 12.04服务器上开发一个用CakePHp 2.3.8编写的应用程序。我想创建一个cron作业来处理每个月第一天发生的情况。每个月,用户都会得到一组他们可以使用的特定任务,如果他们超过了这个限制,他们将根据他们完成的任务数量收取费用。我想创建一个cron作业来完成这项任务,但我担心的是有人会访问这个特定任务的CakePHP操作的URL,然后启动财务交易。

我通读了谷歌关于cron工作的这篇文章,但我不太确定我是否理解他们关于保护URL的说法。

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
    }
}

不能通过url访问非公共成员函数。Cake约定在方法前面加一个下划线。

private function _cron_called_function() {   // or protected
    // do task
}

或者考虑创建一个shell并在饼中建立cron

永远不要使用URL来执行此类任务,这完全是错误的、不安全的,可能会导致脚本失效或服务器不再响应。

假设你有10000个用户,脚本运行时间为30秒,很可能脚本在完成之前就超时了,而此时你只处理了一部分用户。另一种脚本运行时数量很高或无限多的场景可能会锁定服务器。根据脚本或DB操作的不同,它可能会导致服务器的负载很高,并且在脚本运行时使用该网站的用户将遇到一个非常慢且没有响应的网站。

此外,你不能真正在一个URL上运行循环,你可以从一个URL重定向到另一个URL,这样可以模拟100000个用户的循环。如果你不循环记录,但同时获取所有100000条,那么你的脚本很可能会因为内存不足而失效。

您应该创建一个shell来处理循环中的用户,并且始终只处理例如10、50或100个用户的批。

在执行shell时,我建议将其与"nice"命令一起使用,以限制允许shell使用的CPU时间,以防止shell占用100%的CPU来保持站点响应。

你也不能和cron"对话",cron只不过是一个定时执行的东西。你也不能真正指定用户,除非你实现了一个shell,允许你传递一个特定的用户作为参数,例如"cake transactions-user-admin"。如果您想使用特定的系统用户执行shell,请参阅如何在crontab中指定由哪个用户运行脚本?。

查看创建外壳并在蛋糕中设置一个cron。

有很多方法可以防止任何购买您自己的服务器的人访问url。没有人是完美的,但有些人比其他人更好。

如果可能的话,将cron指向一个在web上根本不可见的页面。这可能是一个位于public_html继承结构上方的页面。从服务器内部,可以访问此页面,但不能通过url访问。这是最好的选择,IMO.

另一个选项是将页面限制为服务器的ip地址和请求中的其他值,如post或querystring变量。

当然,你已经发现,你可以在url中包含一个很长的秘密或令牌,这个秘密或令牌的长度足以让你很难或不太可能猜测。

你也可以ping一个页面,然后使用CURL以管理员身份登录并运行该页面——在某些方面,这是最能反映你与网站互动方式的选项。你可以创建一个名为"cron"的管理员,然后像其他管理员一样,有一个"cron的活动日志"。http://php.net/manual/en/book.curl.php