bezpecnost diskuze a jine

Tak.
Mel bych par dotazu na zkusenejsi programatory.
Tak pred ctvrt rokem jsem si udelal takovou amaterskou diskuzi:
formular->insert itno -> vypis tabulky
dokonce jsem to osetril i podminkou if($jmeno="")or($prispevek="") then echo "musite vyplnit pole jmeno a prispevek!"
Nicmene to asi nebylo dostatecne reseni. Od te doby jsem delal na necem jinem, kdyz jsem pak chtel pouzit diskuzi jinde, vzpomel jsem si na tu svou amaterskou a rozhodl se ji pouzit. Bohuzel, nebo mozna bohudik, mi nejaky "hekr"(mozna nekdo z vas :)) ukazal, ze ma ama-diskuze je dost slabe zabezpecena. Nejaky vtipalek mi "poslal" tak 250 prispevku se zdanlive prazdmymi poli "jmeno" a "prispevek". Kdyz jsem se pak podival do tabulky diskuze pres mysql.webzdarma.cz, tak jsem zjistil, ze onech 250 prispevku bylo vyplneno html kodem:
<meta http-equiv='refresh' content='1;url=http://google.com'>

Uvedomil jsem si, ze vstup neni osetren proti html kodu ani proti mezere, je osetren jen proti "". Tak jsem zacal prochazet net, abych se o tomto problemu dozvedel neco vic. Docetl jsem se o SQL injections a podobnych vecech, moc mi to ale nerika.

Prvni dotaz: Mate nejakou dobrou radu pro zacinajiciho phkare, ktery se zabyva, mozna predcasne, diskuzemi, spravou databazi, sessions apod. a ma s tim, co se bezpecnosti tyce, jiste potize?

Je mi jasne, ze si budu muset neco "malo" prostudovat, ale napriklad na php.vrana.cz, kde jsem si cetl par clanku, tak tam jsem tomu moc nerozumel. To pro zacatecniky neni zrovna nejlepsi studijni material.

Druhy dotaz: Znate nejaky dobry zdroj informaci pro pokrocile zacatecniky? :)

Ted trochu z jineho soudku. Mam tabulku s jmeny a hesly uzivatelu a pomoci prihlasovaciho formulare a sessions se mohou uzivatele prihlasit na stranky.

Treti dotaz: Na bezpecnost se ptat ani nebudu, nejake slashovani mi nic moc nerika, to si budu muset holt dostudovat. Chtel jsem se ale zeptat jak udelat, aby se prihlasil "pEpa" kdyz se zaregistroval jako "pepa". aby se nerozlisovali male/velke pismena v prihlasovacim formulari.

Ctvrty dotaz: Daji se pres formular vkladat i ciselne formaty? Nebo jen string?

Nahravani souboru - to je dozajista jeden z nejnebezpecnejsich aspektu spravy webu, nicmene bych to rad pouzil na svych strankach.

Paty dotaz: Dejme tomu, ze chci aby se na web nahraval jen jeden typ souboru. Myslite, ze to bude dostatecne zabezpeceno, kdyz tam dam podminku if(soubor_type==pozadovany MIME typ)?

No to je zatim vse. Dekuji za pozornost :)
1. Dobrá rada: bude to znít tvrdě, ale je třeba se stále učit, pročítat diskuse, hledat články na webu a řešit problémy, které tě při tvorbě a správě stránek potkají. Myslím, že nikde není "univerzální návod", kde se dočteš vše potřebné ve formě "snadno a rychle". Takže shrnutí: léta praxe a úsilí. Jsem zvědavý na další reakce na toto.

2. Ano, internet. Myslím, že tam najdeš vše. Máš-li konkrétní problém, v drtivé většině nejsi první, komu se to přihodilo a máš šanci tento problém i s řešením najít.

3. Pohledej informace o collation (porovnávání) sloupců. Mám na mysli např. cp1250_general_ci versus cp1250_czech_cs.

4. Nevím, co myslíš "čiselný formát", ale čísla vkládat můžeš.

5. V nahrávání souborů na web nevidím nějaký kritický problém. Problém může nastat, až s těmi soubory začneš manipulovat. Já třeba ve své fotogalerii přijímám jen JPG a rozlišuji je přes getimagesize. Navíc, vkládat fotky smí jen registrovaný uživatel. (Registrované uživatele, já jako správce, autorizuji.) Každý přistupuje k bezpečnosti jinak...

Myslím, že je tady spusta prostoru pro další diskuze.
1. no nejak tvrde to nezni, vim, ze bez studia to nepujde. Jen stojim pred problemem, ze bych chtel rozchodit diskuzi tak do dvou dnu. jak jsem rekl jednu funkcni uz mam, ale je slabe zabezpecena, tak jsem se chtel zeptat na co se zamerit jako na nejdulezitejsi vec ohledne chodu diskuze. Ohledne toho problemu s html kodem v textovych polich formulare, neni nejaka fce, ktera by zamezila pouziti html kodu v techto polich?
A nevis co to <meta http-equiv='refresh' content='1;url=http://google.com'> vubec znamena?

2. problem je, ze nektere stranky se tvari, jako ze tvorba www neni zadny problem - to jsou ty pro zacatecniky. A pak jsou ty, ktere bez jakekoliv "predehry" vychrli na ctenare to nejvetsi PHP zlo, ktere snad existuje a z takovych stranek mi jde hlava kolem. Jaksi mi chybi neco mezi zacatecnik - expert.

3. napadlo me jestli neni nejaka fce, ktera by vsechen text prevedla na napr. velka pismena. Neco jako:
velka_pismena($jmeno_form)== velka_pismena($jmeno_tab).
Ale mrknu na to, co jsi mi napsal.

4. Mam formular s textovym polem napr. "vyhrany_zapas":"prohrany_zapas"(skore). Muzu tam zadat cislo a pracovat s tim jako s cislem, nebo mi to vzdy vrati jen string? Chtel jsem pomoci formulare editovat tabulku, kde bych mel skore, z kterych bych vypocitaval body. Nejsem si ale jist jestli to formular umi.
Ja vim odpoved bude urcite nekde na webu, ale pri tvorbe www se tak co hodinu zaseknu nanejakem problemu, pokud nedelam design, a hledani odpovedi, kolikrat i jednoslovne, zabere tak v prumeru hodinu. Takze diskuze tohoto typu je pro me zivou vodou :)

5. No tak jsem zjistil, ze typ souboru, ktery jsem chtel nahravat na web ma stejny MIME typ jako PHP skripty, takze tak jak jsem to rikal, tak tak to nepujde. Slo by hlidat nahravane soubory podle pripony?
1. Ten meta tag funguje tak, že po jedné sekundě po načtení přesměruje stránku a google.com. Ale to musí být v hlavičce. V diskuzi by to udělat nemusel / neměl.

Podívej se na tuto funkci: http://us3.php.net/manual/cs/function.strip-tags.php

To je základ. Pokud by ti do diskuse spamovali roboti, tak ti asi nezbude, než obrázkový kód jako má Oskar (sorry Vodafone na SMS bráně). Nebo můžeš zakázat některé IP adresy. Nic není 100% a obtěžuje to uživatele. je třeba najít vhodný kompromis.

2. Nevím, mi už stačí teferenční manuál na php.net a v případě konkrétního problému hledám na webu.

3. Já jsem to původně pochopil jinak. Podívej se na tyto funkce:
http://us3.php.net/manual/cs/function.strtolower.php
http://us3.php.net/manual/cs/function.strtoupper.php

4. Do formuláře použiješ <input type="text" ... a necháš si poslat data. Přijde ti řetězec. Pokud očekáváš čislo, použij http://us3.php.net/manual/cs/function.is-numeric.php a pokud ti to vrátí false, zobraz chybovou hlášku a nechej uživatele vyplnit a poslat formulář znovu.

5. Nevím, jaké soubory nahráváš. Zkus si po nahrání souboru podívat do pole print_r($_FILES) a uvidíš, jaké informace ti systém poskytne. Samozřejmě, že lze nahrané soubory rozlišovat i podle přípony (ale musíš počítat s podvrhem).
jo diky, mrknu na to.