Autor Zpráva
Meldo
Profil
Poteboval by som spravit naozaj bezpecny script na prihlasovanie. Bezne som pouzival toto:
if (isset($_POST['prihlas'])) {

$meno = $_POST['meno'];
$heslo = md5($_POST['heslo']);

if (file_exists("../spojit_s_dat.php")) {
@include("../spojit_s_dat.php");
}

$over = mysql_query("SELECT `meno` FROM `login` WHERE `meno`='$meno' and `heslo`='$heslo'");
if (mysql_num_rows($over)==1) {
session_start();
$_SESSION['meno']=$meno;
$_SESSION['heslo']=$heslo;
header("Location: index2.php");
exit();
}
else {
header("Location: index.php?login=error ");
}
}

Niesom si však istý, či je to bezpečné. Poradte, co tam pridat, resp. ubrat.
Po prihlaseni potom overujem, ci sa uzivatelova session zhoduje z databazou.
krteczek
Profil
jméno bych před uložením ošetřil htmlspecialchars(); a při kontrole taky, heslo je před vložením převedeno na bezpečný řetězec, takže v pořádku,
session start bych dal na uplně začátek každého skriptu kde session používáš, po ověření přihlášení nejprve použít fci session_regenerate_id(); potom do proměnných $_SESSION dával obsah
nějak takhle:
<?php

session_start();
if (isset($_POST['prihlas']))
{
$meno = htmlspecialchars($_POST['meno']);
$heslo = md5($_POST['heslo']);
if (file_exists("../spojit_s_dat.php"))
{
@include("../spojit_s_dat.php");
$over = mysql_query("SELECT `meno` FROM `login` WHERE `meno`='$meno' and `heslo`='$heslo'");
if (mysql_num_rows($over)==1)
{
session_regenerate_id();
$_SESSION['meno']=$meno;
$_SESSION['heslo']=$heslo;
header("Location: http://www.example.com/index2.php");
exit();
}
}
}
//cokoliv selhalo tak je to špatně
header("Location: http://www.example.com/index.php?login=error ");
?>

tiše předpokládám že formulář je v jiném scriptu...
krteczek
Meldo
Profil
krteczek

Nejak som nepochopil, naco je to session_regenerate_id(). Session_id vobec nepouzivam. Mozno aj to je chyba.?
K
Profil *
jo to taky nechapu session_regenerate_id() ti akorat preplacne session id ale to je tady celkem k nicemu. kazdopadne by bylo lepsi pri zakladani useru si ke kazdymu vygenerovat unikatni hash pomoci napr. md5() a ten pak nacpat do session misto toho jmena a hesla. Nebo misto hashe tam mit id. Proste neco unikatniho. Ale to je na tobe. Jinak pro prehlednost bych ty data do session nacpal pod klicem user(nebo jak chces):

$_SESSION['user']['meno']=$meno;
atp..
krteczek
Profil
session_regenerate_id(); vygeneruje nový identifikátor session, více: http://php.vrana.cz/prihlasovani-uzivatelu.php
K
Profil *
jo vygeneruje novy identifikator(id) session a ponecha data ze stary session to vim, ale k cemu to je v tom skriptu??
krteczek
Profil
K: http://php.vrana.cz/zabezpeceni-session-promennych.php
Dalším typem útoku je Session Fixation. Jedná se o útok, kdy útočník klientovi nastaví nějakou hodnotu Session ID (podstrčením odkazu na webu, v e-mailu nebo např. přímou editací uživatelových cookies) a jakmile se uživatel přihlásí, tak tuto Session ID použije pro sebe. Obrana proti tomuto typu útoku je v PHP poměrně jednoduchá - stačí před prováděním citlivých operací jako je přihlašování zavolat funkci session_regenerate_id, která způsobí změnu Session ID, takže původní ID útočník nebude moci využít.
krteczek
Meldo
Profil
Jasne. Diky. Uz tomu regenerate_id() rozumiem.
maxAV
Profil
Připojil bych k tomuto tématu další otázku:
Jak správně a trochu bezpečně udělat funkci 'pamatuj si mne na tomto počítači'?
Můj postup:
Při správném přihlášení si uložím do cookie nějakou unikátní informaci která jednoznačně identifikuje uživatele. Při odhlášení se tato cookie smázne. Pokud uživatel pouze zavře okno prohlížeče, nebo jen vypší session, cookie zůstane a při další návštěvě proběhne autopřihlášení...

Je to tak správně nebo už někdo vymyslel něco lepšího?
Meldo
Profil
maxAV
No neviem neviem či by som tam dal autoprihlasenie. Stačilo by, aby bolo vyplnene len Prihlasovacie meno. Heslo uz nech uživateľ dopíše. Tak to funguje aj v google analytics a asi aj všade inde.
krteczek
Profil
maxAV: takzvané trvalé přihlášení je v podstatě nesmysl. jde jen o cookie s dlouhou dobou platnosti. v případě že má uživatel nastaveno že cookie platí jen do zavření prohlížeče (obdobně jako session) tak stejně ta cookie propadne, a uživatel se bude muset přihlásit znovu. to navíc přináší nebezpečí že se na jeden učet přihlásí druhý uživatel který pc sdílí. krom toho editací cookis lze v tomto případě pokoušet se o neautorizované přihlášení.
Jen nechej uživatele, aby se poctivě přihlašovali. Stejně si prohlížeče při určitém nastavení pamatují vyplněné formuláře, takže zadá pprvní písmenko jména a hned mu to nabídne možnosti... a heslo se automaticky doplní. spíše bych hledal cestu jak ztížit tak jednoduchý úkon o další formulářové pole kde by vyplnil(opsal) text (jako obranu proti brute force útoku na přihlašovací formulář). Na to doporučím například můj skriptík: http://www.jaknato.com/index.php?clanek=php-ochrana-formularu-pred-spa mem
krteczek
maxAV
Profil
krteczek: asi máš pravdu, ale opravdu si myslíš že je obrana pred brute force atakem potřeba už u prvního přihlášení? Jako ochranu bych doporučil také způsob který navrhuje Jakub Vrána - aoutomatické vyplňování skrytého formulářového pole javascriptem - roboti ho většinou nezvládnou. Článek je tady
maxAV
Profil
Nicméně ještě k tomu autopřihlášení na základě cookie - všechni velcí hráči to nabízí - Yahoo, Google i třeba tato diskuse. Je prevda, že to uživatele nezabije se vždy přihlásit, ale minimálně to ušetří práci při vypršení session... To že je to potenciální bezpečnostní problém je mi ale jasné.
Meldo
Profil
Môžete ten brute force útok trochu rozvinúť? Alebo aspon odkaz.
krteczek
Profil
když se pomocí scriptu opakovaně vyplnuje form tak dlouho dokud nedojde k přihlášení
Meldo
Profil
krteczek
aha. Takze ked budem odchytavat pocet prihlaseni (trebars do cookies) a nastavim max 5 nespravnych tak sa tomu vyhnem.
K
Profil *
krteczek
Dalším typem útoku je Session Fixation. Jedná se o útok, kdy útočník klientovi nastaví nějakou hodnotu Session ID (podstrčením odkazu na webu, v e-mailu nebo např. přímou editací uživatelových cookies) a jakmile se uživatel přihlásí, tak tuto Session ID použije pro sebe. Obrana proti tomuto typu útoku je v PHP poměrně jednoduchá - stačí před prováděním citlivých operací jako je přihlašování zavolat funkci session_regenerate_id, která způsobí změnu Session ID, takže původní ID útočník nebude moci využít.

aha:) diky za info.
Joker
Profil
krteczek
Dík za tip se session_regenerate_id(). Ačkoliv pokud mám session i v databázi a údaje páruju pomocí session id, může to přinést nové problémy.

Což mi připomíná ještě jednu věc, když už se bavíme o opravdu bezpečném přihlašování: "kradení" session. To už je sice řekl bych pokročilá hackerská technika vyžadující určité úsilí, případně specializované nástroje, ale možné to je: uživatel se přihlásí do systému, hacker nějakým způsobem zjistí jeho session id a následně se s pomocí téhož session id nabourá do systému.
Pro ještě vyšší úroveň bezpečnosti se pak dá uložit si do session i nějakou identifikaci uživatele, třeba IP adresu a identifikační řetězec prohlížeče. Před načtením každé stránky pak toto porovnávat a pokud něco nesouhlasí, uživatele automaticky odhlásit. Já tohle ukládám do tabulky v databázi a rovnou to využívám i pro další věci, jako třeba automatické odhlášení po určitém čase neaktivity.

maxAV
Je to velmi poholná funkce a já sám ji často využívám, nicméně musím říct, že je to bezpečnostní riziko.
To, že někdo pustí uživatelův prohlížeč, vejde na příslušný web a aniž by chtěl, je přihlášený na toho uživatele, je jedno riziko, ale je i další:
Testoval jsem to například na phpBB fóru, které si ukládá cookie s ID uživatele a hashem jeho hesla.
Problém je ten, že se znalostí ID daného uživatele (to získáte snadno) a hashe jeho hesla (to už je horší) si můžete vyrobit vlastní cookies s příslušnými údaji a tím se dostat do systému přes toho uživatele.
Jediný problém je získat hash hesla, buď ho extrahovat z cookie na počítači toho uživatele anebo potřebujete přístup k databázi pro čtení. Případně použít nějakou díru v systému, SQL injection nebo script injection ke zobrazení hashe hesla.
Každopádně jsem opravdu vyzkoušel na tom phpBB fóru, že pokud si vyrobíte příslušné cookies (třeba ve správci cookies v Opeře jdou i pohodlně a jednoduše vytvářet nové cookies), na fórum se normálně dostanete jako uživatel, jehož heslo ani neznáte!
Nicméně funkce je to příjemná, ale pokud jí chcete na stránkách používat, určitě bych udělal alespoň to, že uživatel bude moct automatické přihlášení vypnout a pokud bude vypnuté, nebude možné se tak přihlásit ani s platnými cookies. Pak alespoň uživatel může sám rozhodnout, jestli chce raději bezpečí anebo komfort.
Třeba právě to phpBB to má udělané tak, že přepínač na automatické přihlášení akorát vytvoří/vymaže ty cookies, ale i když ho vypnete a pak si cookies vytvoříte, stejně se přihlásíte, takže uživatel se ani vypnutím automatického přihlášení nemůže bránit.
krteczek
Profil
Joker: tu ip, prohlížeč, a další blbosti není třeba ukládat do databáze, stačí do te session ;-)
pokud ukradne jeji id, pri overeni (načtení jakékoliv stránky při přihlášení == overeni techto základních údajů) zjistim jestli to sedi nebo ne, v session nemusim mít celý řetězec informací o prohlížeči a ip adrese, to je zbytečně moc informací, stačí md5 nebo sha1 hash těchto informaci a jeto:-)
krteczek
maxav
Profil *
to je dobry napad s tou volbou jestli na danem uctu povolit pamatovani, nebo ne!
davat do cookie hash hesla mi prijde naivni, ja tam davam hash nahodneho retezce,ktery se vzdy nove vygeneruje pri uspesnem prihlaseni. ano, skyta to urcite nevyhody, ale i vyhody. favorizuje to praci na jednom pocitaci, pokud se uzivatel prihlasi treba ve skole, jeho domaci cookie je pak neplatna..
krteczek
Profil
Navíc na co ukládat do session hash hesla? já ho nepotrebuji, stačí mi jen ty udaje, které někde využívám (prihlasen, id, jmeno, hash_ip, hash_prohlizec, možná nějaké další).
to jsou veci ktere mi bohatě stačí, nepotřebuji kvuli nim lezt při každem načtení stránky do databáze a ověřovat proti databázi.
krteczek
Joker
Profil
krteczek
tu ip, prohlížeč, a další blbosti není třeba ukládat do databáze
No dyť ale já jsem psal, že se to dá uložit do session ;) Akorát já ve svém skriptu to ukládám do databáze. Ale šlo by to i do session. Akorát prostě používám skript, který jsem napsal před několika lety a tehdy mě nenapadlo, že vlastně databázi nepotřebuju :) Tomu se říká "Legacy situation" ;)

Navíc na co ukládat do session hash hesla?
IMHO zbytečnost, já to nedělám.

maxav
davat do cookie hash hesla mi prijde naivni, ja tam davam hash nahodneho retezce,ktery se vzdy nove vygeneruje pri uspesnem prihlaseni
Jako že při každém (automatickém) přihlášení se přegeneruje ta cookie s nějakým novým řetězcem?
Hmm, ale to, že se automaticky zneplatní automatické přihlášení z jiných počítačů by mi docela vadilo :-/
Možná by šlo radši do cookie místo hashe hesla uložit něco jako md5(heslo + IP). Tím by cookie byla platná jenom pro jednu IP adresu, přitom by ale šlo být trvale přihlášený z více počítačů a zároveň i když by někdo získal cookie, nedokázal by podle ní vygenerovat fungující falešnou cookie (potřeboval by k tomu vědět uživatelovo heslo no a kdyby ho znal, může se už rovnou normálně přihlásit)
edit: Jediná nevýhoda je u dynamicky přidělovaných IP adres, uživatel na dial-up připojení by holt při každém odpojení byl automaticky odhlášený.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0