Vlákno názorů k článku Programování pod Linuxem pro všechny (3) od galaxi - Dajme tomu,že by sme mali vytvoriť nepredvídateľný názov...

  • Článek je starý, nové názory již nelze přidávat.
  • 7. 2. 2004 11:05

    galaxi (neregistrovaný)

    Dajme tomu,že by sme mali vytvoriť nepredvídateľný názov súboru.no v Linuxe veľmi neprogramujem(nezabite ma) ale v Dos-eje take daco ako random() ja si myslim,ze takto sa da urobit celkom nepredvidatelny subor.
    A uspori sa tym zdrojak.

    //nejedzte Kinder pinguin-Tucniaky sa maju chranit nie jest!!!

  • 7. 2. 2004 14:20

    Yeti (neregistrovaný)

    Nepředvídatelný název souboru je jedna věc (BTW random() je bez seedu z něčeho jako /dev/random předvídatelný, nevím moc, jak ho seedovat v DOSu, aby byl opravdu nepřevídatelný...), další jsou jeho otevření se správnými právy, bez možnosti symlink útoku, etc.

  • 9. 2. 2004 19:28

    Petr Baudis (neregistrovaný)

    Pokud uz to chcete delat rucne, random() neni dostatecne jedinecny, tzn. je moznost, ze dvema soucasnym procesum vyjde stejny nazev souboru. Z tohoto hlediska je mnohem rozumnejsi getpid(), ktere je takto unikatni. Pak si musite zkontrolovat, jestli ten soubor uz neexistuje, napriklad ho utocnik muze predvytvorit jako symlink nekam k sobe a data si pak precist.

  • 9. 2. 2004 22:20

    Jirka Kosina (neregistrovaný)

    > pak si musite zkontrolovat, jestli ten soubor uz
    > neexistuje, napriklad ho utocnik muze predvytvorit
    > jako symlink nekam k sobe a data si pak precist

    Testovani existence/neexistence souboru samo o sobe smrdi race condition, pokud se neudela spravne.

    Tzn naivni reseni, ktere lze jeste dnes najit skutecne v leckterych programech (a ktere nefunguje), je (v pseudokodu):

    stat(filename, &st);
    if (!S_ISREG(st.st_mode)) return(-1);
    fd = open(filename, ...)

    mezi radky 2 a 3 je na prvni pohled viditelna race condition - pokud utocnik trefi chvili, kdy probehl test ze soubor neni symlink (radka 2), ale jeste se soubor neotevrel (neprobehla radka 3) a vytvori v tu chvili symlink, ma vyhrano.

    Jedno ze spravnych reseni je soubor nejdrive pomoci open() otevrit a pak teprve na od jadra pridelenem deskriptoru provadet fstat() - je zaruceno, ze jakmile programu kernel jednou deskriptor priradi, "to pod nim" se uz zmenit nemuze (tzn. nikdo nam nevymeni soubor za symlink, apod.).