Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

CGI wywołane wielokrotnie - zabezpieczenie?

antyBrygadaW 01 Mar 2005 08:48 999 6
  • #1
    antyBrygadaW
    Level 15  
    cześć!
    czy możecie mi zdradzić swoją metodę na zabezpieczenie
    skryptu CGI napisanego w C (Windows i UNIX/Linux) przed
    wielokrotnym wywołaniem? chodzi mi o to, żeby zrobić tak,
    żeby w jednym momencie był uruchomiony tylko jeden skrypt
    a pozostałe mają oczekiwać na swoją kolejkę...
    czy to jest wogóle wykonalne?

    pozdr.
  • #2
    lam4
    Level 14  
    Pewnie
    kilka rozwiazan jest, ja bym sie sklanial do takowego,
    na poczatku wykonywania skrypt sprawdza czy istnieje plik "x"

    jezeli nieistnieje to dziala dalej
    jezeli istnieje to exit.

    skrypt twozy sobie plik "x"
    i wykonuje swoj algorytm, czyli to co ma robic.
    skonczyl robic - usuwa plik "x"

    voila, jeden bedzie tylko naraz uruchomiony, istnieje tylko problem z prawami do zapisu w katalogu (twozenia plikow) ale pod winda to nie gra roli.

    inna obcja - jest plik "x" przez caly czas, ale skrypt zczytuje jego zawartosc, i warunek zmienia sie na istnienie zawartosci pliku.
    Powiedzmy ze gdy w pliku jest jakis ciag to znaczy ze juz jakis skrypt dziala, jezeli jest pusty to znaczy ze niedziala i zapisuje i dziala dalej i jak przestanie dzialac to wymazuje :)

    ksiakos tak
  • #3
    tszczesn
    Old radio specialist
    lam4 wrote:
    Pewnie
    kilka rozwiazan jest, ja bym się sklanial do takowego,
    na poczatku wykonywania skrypt sprawdza czy istnieje plik "x"

    jezeli nieistnieje to dziala dalej
    jezeli istnieje to exit.


    Metoda zacna, ale nieskuteczna jak skrypt z jakiegokolwiek powodu (np. zakończy się przedwczesnie) nie usunie tego pliku. Wtedy pozostanie tylko ręcznie wykryć ten fakt i plik usunąć.

    Proponuję po prostu przy wywołaniu sprawdzić, czy nie ma już takiego procesu - pod linuksem otworzyć plik /proc/PID/cmdline, dla wszystkich znalezionych PIDów i sprawdzić, czy nie ukrywa się tam ten sam skrypt. Jak się znajdzie (poza włanym PIDem oczywiście :) to grzecznie go zakończyć. Pod Windows nie wiem.
  • #4
    lam4
    Level 14  
    tszczesn wrote:

    Metoda zacna, ale nieskuteczna jak skrypt z jakiegokolwiek powodu (np. zakończy się przedwczesnie) nie usunie tego pliku. Wtedy pozostanie tylko ręcznie wykryć ten fakt i plik usunąć.

    Prawda, zgadzam sie, ale to rozwiazanie jest zdecydowanie najlatwiejsze :)
    No i jezeli skrypt jest prosty to mozna zalozyc ze "bezawaryjny" :D
    zreszta napisal ze to w C ma byc, a tam obsluga wyjatkow jest.

    tszczesn wrote:

    ...Pod Windows nie wiem.

    tez jest taka mozliwosc (odczytania listy aktywnych procesow)
  • #5
    tszczesn
    Old radio specialist
    lam4 wrote:
    tszczesn wrote:

    Metoda zacna, ale nieskuteczna jak skrypt z jakiegokolwiek powodu (np. zakończy się przedwczesnie) nie usunie tego pliku. Wtedy pozostanie tylko ręcznie wykryć ten fakt i plik usunąć.

    Prawda, zgadzam się, ale to rozwiazanie jest zdecydowanie najlatwiejsze :)
    No i jezeli skrypt jest prosty to mozna zalozyc ze "bezawaryjny" :D
    zreszta napisal ze to w C ma byc, a tam obsluga wyjatkow jest.


    Założenie, że program działa bezawaryjnie to trocę ryzykowne jest :)



    lam4 wrote:
    tszczesn wrote:

    ...Pod Windows nie wiem.

    tez jest taka mozliwosc (odczytania listy aktywnych procesow)


    To ja wiem, ale pojęcia nie mam jak, windowsów nie używam.
  • #6
    Sam Sung
    Level 32  
    Zamiast pliku blokującego można też użyć systemowego mechanizmu komunikacji międzyprocesowej. Niestety, znane mi kompilatory pod windows (może poza gcc na cygwinie, nie sprawdzałem) nie są pod tym względem zgodne z POSIXem, więc i tak trzebaby tworzyć oddzielny kod pod windows wykorzystujący np. WinAPI.

    Jeśli ma być zapewniona kolejność wykonywania skryptów zgodna z kolejnością ich wywołań, to chyba nie obejdzie się bez działającego cały czas w tle procesu-nadzorcy.

    Co do odczytu listy procesów pod Windows - służy do tego ToolHelp API: nagłówek <tlhelp32.h>, funkcja m.in. CreateToolhelp32Snapshot. O ile dobrze pamiętam, w Platform SDK był dobry przykład, jak tego używać.

    EDIT: Teraz zauważyłem, że problem już chyba dawno nieaktualny :)
  • #7
    antyBrygadaW
    Level 15  
    nie nie problem jest cały czas aktualny i dzięki za informacje

    aktualnie zrobiłem opcję z plikiem nieco zmodyfikowaną, ale nie wydaje mi się to w 100% pewne...