| | |
| Stránka: 1 z 1
| [ Príspevkov: 15 ] | |
Autor | Správa |
---|
Registrovaný: 21.09.08 Prihlásený: 14.11.17 Príspevky: 225 Témy: 74 Bydlisko: Michalovce |
Nazdarek. Viem, ze co sa tyka spam ochrany tak sa tu uz cosi popisalo, no nedavno som nasiel na nete jedno uplne jednoduche riesenie a tak by ma zaujimal vas nazor. Chlapik co to prezentuje, tvrdi ze to ma zatial na 100% funkcne.. Tu je skript tej spam ochrany.
Kód: <div style="visibility:hidden;"> <input type="text" name="mail" value="" /> </div> <input class="button" type="submit" value="Odeslat" name="posliDotaz" /> <?php if(isset($_POST["posliDotaz"])&&$_POST['mail']==""){ echo 'Vyplneno v poradku'; } else{ echo 'Vyplnil jsi neviditelne pole jsi bot'; } ?>
Nebudem to rozpisovat, je to hadam kazdemu uplne jasne. Zaujima ma Vas nazor. Ci by to v praxi mohlo naozaj dobre fungovat.
A mam este jednu otazku.
Totiz ako dostatocne zabezpecit vstupy napr. na nejakom chate, alebo pridavani komentarov, posielani posty a pod. Staci pouzit addslashes a htmlspecialchars? Lebo akokolvek nad tym premyslam, tak ma nic ine nenapda. Nemozem uzivatelova povolit pri pisani chatu, posty a pod. len nejake znaky... Mozte mi poradit? Ako to osetrujete vy...? Dakujem za kazdu odpoved.
|
|
Registrovaný: 21.02.07 Prihlásený: 21.02.10 Príspevky: 3984 Témy: 96 |
Ako riešenie je to veľmi zaujímavé, neviem či funkčné ale za povšimnutie stojí (možno ho využijem). Na otázku ako ošetrovať znaky, odpovedám, že sú prakticky dve možnosti - blacklisting a whitelisting.
Pri blacklistingu určíš čo všetko tam určite nesmie byť. Nato využívam funkciu htmlspecialchars (v súčastnosti upravenú funkciu safety).
Whitelisting je systém, kde určuješ iba čo tam môže byť, a to robím cez regulárny výraz.
|
|
Registrovaný: 21.09.08 Prihlásený: 14.11.17 Príspevky: 225 Témy: 74 Bydlisko: Michalovce |
No ta spam ochrana by mohla podla mna celkom dobre fungovat. Pochybujem totiz ze boty su nastavene na skumanie div tagov, resp. vlastnosti divu. Ale neviem..nemam s tym totiz zatial este ziadnu skusenost.
Tominator...Mohol by si mi trocha konkretnejsie vysvetlit ten blacklisting a whitelisting?? Nejako mi to totiz nic nehovori, akurat to ze jedno je na zakazane prvky a druhe na povolene.. Ak by si mi to mohol trocha vysvetlit (najlepsie na nejakom priklade: napr. ako to ma vyzerat, ako to zapisat do mojho scriptu a pod.), bol by som ti vdacny. Popripade hodit nejaky link, kde by som nasiel nejake vysvetlenie..DIK
|
|
Registrovaný: 21.02.07 Prihlásený: 21.02.10 Príspevky: 3984 Témy: 96 |
1, to neviem to by bolo lepšie, keby sa vyjadril niekto kto botom rozumie
2,
Problém
Problémom je, že máš podsystém, či to je databáza, HTML výstup, XML ... Tento podsystém funguje s nejakými znakmi a preto pokiaľ mu útočník dá "podsystémové kľúčové znaky" (tak som to teraz vymyslel ), tak môže dôjsť ku neželanému efektu. Tieto znaky môžme nazvať nebezpečné alebo škodlivé. Využíva sa to nepr. pri SQL injdection či XSS
Príklad SQL injection:
Kód: <?php include "config.php"; $DB = mysql_query('SELECT * FROM clanok WHERE ID="'. $_POST["ID"] .'"'); ... ?> Ja ti pošlem: asd"; DROP TABLE clanok --Vymaže ti to tabuľku clanok (teda ak som sa nikde nepomýlil ). //"mysql_query() sends a unique query (multiple queries are not supported) to the currently active database..." (stenley)Príklad XSS: Kód: <?php include "config.php"; $DB = mysql_query("INSERT INTO clanok VALUES(NULL, '". $_POST["obsah"] ."')"); ?>
Ja ti pošlem: nejaky clanok <script>document.location="http://www.google.sk";</script>
Po zobrazení článku uživateľa presmeruje na google. (Tiež ak som to správne napísal , ale píšem to narýchlo, nechce sa mi to overovať)
--------------
Riešenie:
Riešenia sú dve: Blacklisting a whitelisting.
Blacklisting využíva, to že poznáme nebezpečné znaky. Pokiaľ ich vieme tak môžme urobiť dve veci: Zisťovať ich prítomnosť, a pokiaľ tam sú vrátime uživateľovi formulár, že tieto znaky nie sú tolerované. Používanejšie je prejsť to funkciami, ktoré ich nahradia za entity, teda znaky, ktoré už na podsystém nemajú vplyv.
Nato sa využíva funkcia htmlspecialchars. Na fóre v často používaných scriptoch je funkcia safety od stenleyho, ktorá je celkom užitočná v tom, že ti to prejde aj cez pole a nahradí každú hodnotu v poli, za jej bezpečnú hodnotu. Ja som funkciu safety ešte rozšíril a ošetrujem znaky ako %,' a iné.
Whitelisting sa využíva, keď vieme aké znaky môže vstup obsahovať. Pri whitelistigu sa využíva funkcia ereg (a iné, ktoré pracujú s regulárnymi výrazmi). Cez regulárny výraz sa zisťuje, či každý znak zodpovedá predpísaným znakom.
Ako taký regulárny výraz vyzerá?
^([a-zA-Z])$ - povolí len písmená (veľké a malé, bez diakritiky)
^([0-9]{8})$ - povolé len osemiestne číslo (moja predstava o ideálnom mesačnom plate )
Kedy použiť WH a kedy BH??
WH je idálny napr. na registračné formuláre, kde máš inputy. Kde uživateľ vypĺňa polia ako vek, meno, priezvisko, mesto ...
BH je ideálny v článkoch, kde nevieme čo všetko uživateľ môže použiť (nechceme ho príliš obmedzovať) ale vieme čo by sme nechceli aby sa nám dostalo do podsystému.
Všeobecné pravidlo platí, že je dobré uprednostňovať WH pred BH.
//Ešte by som dodal, že dobrá knižka na bezpečnosť je: Zraniteľný kód. Odporúčam prečítať. Viac v téme Knihy, knihy, knihy ...
|
|
Registrovaný: 21.09.08 Prihlásený: 14.11.17 Príspevky: 225 Témy: 74 Bydlisko: Michalovce |
Ta ak som to spravne pochopil, tak Whitelisting a Blacklisting je vlastne len funkcia/kod v mojom skripte, ktory mi osetri vstupne data?? Pozeral som aj ten stenlyho prispevok v teme Často použivane skripty. Ale ak to spravne chapem, tak je to v podstate to, ze si premennu zo vstupu osetrim cez pole a entity.
Cize mohlo by to vyzerat aj takto?:
Kód: $data =htmlspecialchars(addslashes($_POST["data"])); $vlozene = array("=", "%", ")", "("); if (in_array("$data", $vlozene)) { $nahradit = array("", "and", ">", "<""); $novytext = str_replace($vlozene, $nahradit, $data); $novedata = "$novytext"; } else { $novedata = ""; }
Alebo nieco v tomto duchu?? A este jedna vec. Co vlaste zakazat ( ake znaky) uzivatelom napr. pri chate, ak si tak radi kreslia smajlikov, alebo * si vykresluju rôzne tvary? Spominas, ze si nahradzas napr. %. Cim ho nahradzas? Ved napriklad ked uzivatel napise niekomu vetu typu: Včera mi to vyšlo na 100%. Tak ak mu nahradim napr. tie %, tak sa mu uz potom objavi nieco ine..ina veta.. Alebo je to cele inac??
|
|
Registrovaný: 21.02.07 Prihlásený: 21.02.10 Príspevky: 3984 Témy: 96 |
ja napr. využívam prerobenú funkciu safety, v znení:
Kód: function MakeMeSave(&$input) { if(is_array($input)) { array_walk_recursive($input,"SaveValue"); } else { SaveValue($input); } }
function SaveValue(&$value) { if(get_magic_quotes_gpc()) { $value = stripslashes($value); }
$value = htmlspecialchars($value); $value = str_replace("'","'",$value); $value = str_replace("\\","\\\\",$value); $value = str_replace("%","%",$value); $value = trim($value); }
A potom bezpečnosť môžeš riešiť aj globálne typom: Kód: <?php
MakeMeSave($_POST); MakeMeSave($_GET); MakeMeSave($_COOKIE); MakeMeSave($_SESSION);
?>
A už máš všetky hlavné vstupy v podstate ošetrené cez BL. (Predtým som dával z neznámeho dôvodu BH ). Potom ti už len treba cez WL ošetrovať hodnoty zo $_SERVER, keďže cez BL to nejde ... (ošetruj ich aba ak ich potrebuješ, napr. sa pýtaš na jazyk, alebo stránku odkiaľ prichádza a pod., inak sa ti môže stať, že ti stránka nepôjde)
|
|
Registrovaný: 21.09.08 Prihlásený: 14.11.17 Príspevky: 225 Témy: 74 Bydlisko: Michalovce |
Tominator... Neviem ci to dobre chapem, ale ak pouzijem ten tvoj script co si napisal, tak uz nemusim potom osetrovat vstupy?? Cize uz rovno to zapisem:
Kód: $meno =$_SESSION['uzivatel']; a nemusim to uz osetrovat pomocou htmlspecialchars a addslashes? A mohol by si mi prosim ta vysvetlit tento zapis??: Kód: $value = str_replace("'","'",$value); $value = str_replace("\\","\\\\",$value); $value = str_replace("%","%",$value);
Preco tam mas 2x po sebe ten isty znak??
|
|
Registrovaný: 21.02.07 Prihlásený: 21.02.10 Príspevky: 3984 Témy: 96 |
1, Nie už to nemusíš riešiť
2, Sekol som sa, opravené:
Kód: $value = str_replace("'","'",$value); $value = str_replace("\\","\\\\",$value); $value = str_replace("%","%",$value);
//hmm, nevidim tam rozdiel (stenley)
|
|
Registrovaný: 21.09.08 Prihlásený: 14.11.17 Príspevky: 225 Témy: 74 Bydlisko: Michalovce |
Tominator..Nevidim vobec ziadny rozdiel medzi tou prvou verziou a tym "opravenym"... Podla toho co pises
Kód: $value = str_replace("%","%",$value);
tak tomu rozumiem tak, ze % nahradza %, ale to mi nedava nejako zmysel..Mohol by si mi to prosim ta vysvetlit??
|
|
Registrovaný: 21.02.07 Prihlásený: 21.02.10 Príspevky: 3984 Témy: 96 |
prosim stenleyho aby mi vymazal posledný post ide o to že prehliadač ti to automaticky prepíše .. preto nevidíš rozdiel (fakt blbé ...)
takže
' za & #39;
% za & #37;
(bez medzery, lebo keby som dal ja bez medzery tak spraví to čo hore)
|
|
Registrovaný: 30.09.07 Prihlásený: 30.11.11 Príspevky: 143 Témy: 37 | Napísal Feko: 08.01.2011 20:52 | |
|
Práve brouzdám netom a hladam volajake fajn osetrenie vstupu a toto Tominatorove riesenie, ze mi prejde vsetky prenasane hodnoty kontrolou na zaciatku skriptu sa mi zda velmi fajn. Len tym zamenam % a apostrofov tiez velmi nerozumiem. Ak sa mi prepise % za %, percento sa mi do tabulky zapise tak ako je- a rovnako sa mi z nej aj cita, tak som si ten vstup asi pred % velmi neosetril. Ci mi nieco unika? Alebo som to zle pouzil? Vidim, ze autor mi uz asi velmi neodpovie, ale vedel by sa k tomu niekto vyjadrit? Pripadne mi odporucil nejake podobne jednoduche a elegantne riesenie na osetrenie vstupu?
Vopred vdaka.
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 Bydlisko: Brno | Napísal Ďuri: 08.01.2011 21:01 | |
|
To je featura/bug systemu, na ktorom bezi toto forum - prevadza nam ciselne entity na klasicke znaky. Pointa je, aby si napriklad ' previedol na ', % na % a tak.
|
|
Registrovaný: 30.09.07 Prihlásený: 30.11.11 Príspevky: 143 Témy: 37 | Napísal Feko: 08.01.2011 21:20 | |
|
JJ, ale kde sa to vlastne prevadza? Ved po tomto prevode by mi do tabulky malo vpisat namiesto % - %. Ci nie?
|
|
Registrovaný: 11.08.07 Príspevky: 4088 Témy: 34 Bydlisko: Brno | Napísal Ďuri: 08.01.2011 21:27 | |
|
Ono sa to prevedie a do tabulky sa aj zapise dana entita. Len ty ked potom opat vyberas tie data a vypisujes ich, tvoj prehliadac ti ich prevedie na bezne znaky. Ale skus si data z DB vypisovat napr. do text/plain suboru, uvidis, ze su tam entity.
|
|
Registrovaný: 30.09.07 Prihlásený: 30.11.11 Príspevky: 143 Témy: 37 | Napísal Feko: 08.01.2011 23:56 | |
|
Ok. A tym padom mam taku zakladnu bezpecnost zaistenu? SQL injdection či XSS? Na co si popripade este posvieti?
|
|
| Stránka: 1 z 1
| [ Príspevkov: 15 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|