V neděli 11.5. 2008 byl na těchto stránkách (mlades.webz.cz) smazán soubor, ve kterém byly uloženy příspěvky z fóra. Já sám jsem ho určitě nemazal, takže by mě zajímalo, jak k tomu mohlo dojít, jestli to někdo hacknul či co... případně, jestli by se nedal soubor nějak obnovit. (Já určitou zálohu mám, ale neobnovím celý všechny příspěvky.. v podstatě se nic neděje, ale je škoda přijít o hezké příspěvky ve fóru :-). Předem děkuji za vysvětlení, či objasnění.
A jak jsi přistupoval k tomu souboru? Obecně mít dynamická data v textovém souboru je rizikové. Při současném přístupu více uživatelů jeden soubor po vložení příspěvku vymaže, že bude vkládat další a jiný uživatel načte prázný soubor, který pak uloží. Na toto je mnohem vhodnější a bezpečnější databáze.
Diky za reakci, k souboru jsem přistupoval přes ftp, přístup tam mám jen já (nikdo jiný nezná heslo a ani na stránky nic nemůže nahrát...) To, že je to rizikové, vím, ale nechtělo se mi fušovat do MySQL, když to jde udělat takhle jednoduše... není to žádný hokus pokus, už skoro rok tam to fórum bez problému fungovalo.
<HTML>Jene, zbi to myslel s tím přistupováním asi jinak. Máte PHP skript, který přímo přistupuje k souboru (fopen, fread, fwrite, fclose... apod.). Jednoduchá návštěvní kniha, jejíž jednoduchost zjevně obdivujete, se chová po zaslání příspěvku takto:
<ul><li>Přečtu si seznam příspěvků a natáhnu jej do paměti (do nějakého pole)</li>
<li>Přidám jako další položku do pole nový příspěvek</li>
<li>Soubor vymažu a zapíšu do něj aktuální pole příspěvků</li></ul>
Myšlenka dobrá, bohužel má díru. Server, na kterém jsou stránky provozovány, je vícevláknové prostředí. To znamená, že pokud se sejdou dva požadavky ve stejný okamžik (a k tomu na WZ dochází neustále), nejsou zpracovávány jeden za druhým, ale mohou se zpracovávat současně.
Úplně paralelní to zpracování není. Ale zkuste si představit uživatele A a uživatele B.
(čas uváděn v mikrosekundách, ale je to fakt jen ilustrace)
T+00: [A] Uživatel A pošle příspěvek
T+02: [A] Skript je zparsován, začíná zpracování
T+03: [A] Načteno pole příspěvků ze souboru.
T+04: [A] Přidán příspěvek do pole.
T+05: [B] Uživatel B pošle příspěvek.
T+06: [A] Smazán soubor s knihou.
T+07: [B] Skript je zparsován, začíná zpracování
T+08: [B] Načteno pole příspěvků ze souboru.
T+09: [A] Zapsány příspěvky do souboru, skript končí.
T+10: [B] Přidán příspěvek do pole.
T+12: [B] Smazán soubor s knihou.
T+14: [B] Zapsány příspěvky do souboru, skript končí.
Výsledek: Návštěvní kniha obsahuje pouze jeden příspěvek, a to od uživatele B.
Ono může být i hůře, dokonce nám stačí 1 uživatel:
T+00: [C] Uživatel poslal příspěvek.
T+03: [C] Skript zparsován, zahájeno zpracování.
T+04: [C] Načteny příspěvky ze souboru do pole
T+06: [C] Zapsán nový příspěvek do pole
T+08: [C] Vymazán soubor.
T+09: [C] Uživatel ruší požadavek, skript končí.
Výsledek: Soubor je prázdný.
Řešení: Použít databázi.</HTML>
"Řešení: Použít databázi."
Není třeba hned nasazovat databázi ;) A dokonce ani databáze není všemocná. Mě se osvědčila tahle sranda: http://latrine.dgx.cz/atomicke-operace-jeste-jednou
To Nípal:
Díky moc, už jsem to pochopil :-). Přesně tohle jsem potřeboval vědět :-)