Volání akcí v cronu a zabezpečení

jedlicka
Člen | 70
+
0
-

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
+
+3
-

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
+
0
-

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
+
0
-

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
+
+4
-

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.

MajklNajt
Člen | 498
+
0
-

Michal Hlávka napsal(a):

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();
}

on to ale nepúšťa cez CLI…

CZechBoY
Člen | 3608
+
+1
-

jj nejjednodussi je posilat konstantni token a ten potom validovat pri startu aplikace

tedy neco jako https://domena.cz/cron/sms?token=jvddtinjoopjncdsqqsvbuopbbdsarhb

Editoval CZechBoY (14. 2. 2020 16:42)