Volání akcí v cronu a zabezpečení
- jedlicka
- Člen | 70
Ahoj,
měl bych dotaz na to, jak správně implementovat cron, aby ho nemohl spustit „kdokoliv“.
Mám CronPresenter a v něm nějakou akci:
<?php
class CronPresenter extends BasePresenter
{
public function actionSms()
{
...
}
}
?>
Takže pokud do prohlížeče zadám url: https://domena.cz/cron/sms, tak se cron vykoná.
Hostuji na českém hostingu a tam je v adresáři (pro daný čas/periodu) pro cron php script, který zavolá dané url:
<?php
file_get_contents('https://domena.cz/cron/sms');
?>
Toto ovšem znamená, že kdokoliv zadá do prohlížeče dané url, tak se akce cronu zavolá/vykoná.
Jak ten cron udělat, aby ho šlo spustit opravdu jen z daného scriptu a nikoliv přímo z url? Resp, jak to zabezpečit, aby to nemohl zavolat kdokoliv.
V jakémkoliv jiném presenteru se v startup()
zjišťuje, zda
je uživatel přihlášen, ale to v cronu nelze – nespouští ho uživatel,
ale skript.
Moc děkuji za každou radu.
Martin
- Kamil Valenta
- Člen | 820
Je to relativně častý nešvar hostingů. Samozřejmě úlohy cronu vůbec není potřeba spouštět requestem a mít na ně veřejně dostupné routy. Ideální je spouštět je z CLI.
Pokud z nějakého důvodu nemůžeš, tak pak asi omezit přístup ke skriptu na IP, nebo si posílat nějakou header s tokenem.
A nebo úlohu napsat tak, aby případné spuštění „z venku“ nevadilo, ono by to stejně tak i mělo být, vícenásobné spuštění by nemělo nic „rozbít“.
Editoval kamil_v (14. 2. 2020 9:04)
- Ivorius
- Nette Blogger | 119
Tak ono pravidelné spouštění exportů např. pro heureku apod. může celkem slušně vytížit prostředky sdíleného hostingu, takže imho zabezpečit takovéto akce je na místě. Na blueboardu to dělám přes kontrolu IP. Dělám však i mimo to kontrolu, jestli se náhodou IP cronu nezměnilo, abych pak nepřišel o exporty pokud se tak stane.
- Michal Hlávka
- Člen | 190
Mel by si to resit uplne jinak, ale pokud ti mam poradit v tvem reseni, dej si do startup metody
if (PHP_SAPI !== 'cli') {
$this->error();
}
Edit: Nepochopil jsem problem, tak beru zpet.
Editoval Michal Hlávka (14. 2. 2020 13:07)
- Kamil Valenta
- Člen | 820
Ivorius napsal(a):
Tak ono pravidelné spouštění exportů např. pro heureku apod. může celkem slušně vytížit prostředky sdíleného hostingu, takže imho zabezpečit takovéto akce je na místě.
Nemyslím si, že by mělo vadit, že se export nevyžádal cronem z CLI ale
uživatelem z HTTP requestu.
Znovu říkám, raději bych úlohu napsal tak, aby vícenásobné spuštění
nevadilo. Export si např. může pamatovat, kdy byl naposledy spuštěn a znovu
se provede až zase za hodinu. A za hodinu se nechá spustit, ale bude mu jedno
kým dřív.