Ochrona skryptów PHP przed wywołaniem

Skrypt nad którym pracowałem sobie dzisiaj, wymaga aby pewna jego czynność była wykonywana codziennie – w sumie to nie zaszkodziło by jakby wykonywała się więcej niż jeden raz – ale tak dla przyszłych, być może, rozwiązań trzeba by nieco zawyżyć wymagania.

Na szczęście na serwerze dostępny był cron, którym można by wywoływać skrypty php (czasem są z tym małe problemy) – coś takiego jak tutaj mamy. Pojawił się inny problem – jak zabezpieczyć skrypt przed wywołaniem go paska adresu – w przeglądarce.

Jednym ze sposobów jest coś takiego:

/**
* Check remote address (allow only from localhost). If not working - write here 'localhost' or IP your server
*/
if ($_SERVER['REMOTE_ADDR'] != 'localhost')
{
	die("Ciekawe co chciałeś tutaj zrobić?");
}

(zapożyczone ze strony wiki projektu Vallheru)

A… byłbym zapomniał: edycja pliku .htaccess odpada w moim przypadku.

Ja z kolei wymyśliłem coś innego, sprawdzam czy istnieje zmienna (isset) $argv – jeśli tak, plik php został wywołany z linii poleceń (czyli cron np.), jeśli nie, ktoś wywołał go prawdopodobnie przez przeglądarkę.

if (isset($argv))
	echo "Z konsoli.\n";
else
	echo "Server.\n";

Uwaga: jak wykazano w 2gim komentarzu do tej notki nie jest to za najlepsza metoda. Po szczegóły odsyłam do wspomnianego komentarza.

Jeśli ktoś ma jakieś doświadczenia w powyższej materii, chętnie posłucham.

8 thoughts on “Ochrona skryptów PHP przed wywołaniem

  1. No i jak połączysz te dwie metody, to pewnie wystarczy, cóż chcieć więcej, przecież ludzie nie szukają na siłę ukrytych skryptów, żeby je wywoływać. 🙂

    Like

  2. Agrrr, ludku, wiem, że chciałeś dobrze, ale isset($argv) to złe rozwiązanie:http://pl2.php.net/manual/en/ini.core.php#ini.register-argc-argv
    nie wrzucaj takich rzeczy na bloga, bo ktoś to bezmyslnie skopiuje i będzie znowu jakie to php jest ble, pfe i niebezpieczne.

    Do php w linii komend jest php-cli, czym się różni od zwykłego php masz tu opisane:
    http://pl.php.net/features.commandline

    A na koniec rozwiązanie twojego problemu:
    if(PHP_SAPI != ‘cli’)die(‘bitch’);

    Like

  3. @Walker: zmienna $_SERVER nie jest chyba ustawiana podczas wywoływania z konsoli, ale w sumie podobnie myślałem o $argv.
    Nie musi na siłę. Może ktoś przez przypadek to wywołać, albo ktoś kto ma dostęp do kodu (w końcu to PHP) może złośliwie sprawdzić co się stanie. Np.: w wspomnianej grze ta cronowa część odpowiada za resety no i jest publicznie dostępna, nic tylko wywoływać (o ile pozostałoby nie zabezpieczone).

    @Michał Ochman: nie zawsze jest to możliwe, można w adresie podać "../" (czyli przejście do nadrzędnego katalogu), a po za tym, dobrze by było, żeby pliki jednego projektu trzymały się razem, a nie były nie wiadomo gdzie porozrzucane.

    @whatever: Bardzo dziękuje za uwagi i krytykę. Poprawiłem w kodzie, zaraz poprawię i ten wpis.

    Like

  4. Sorry, zaraz poprawię. Nie grywam ani w Vallheru, ani w Orodlin, tylko raz przypadkiem natrafiłem na kod tego silnika, myślałem, że znajdę tam coś, co wtedy mi było potrzebne, jednak okazało, że nie wiele tam można zobaczyć (może z następnymi wersjami poprawią ten kod).

    Like

  5. Akurat tak się składa że to ja jestem tym który go poprawia 😀 I zgodzę się z tobą w zupełności, że wiele tam nie zobaczysz ciekawych technik. Zapraszam za to do siebie na bloga 😀

    Like

Comments are closed.