Autor | Zpráva | ||
---|---|---|---|
_fantomas Profil |
#1 · Zasláno: 22. 6. 2014, 15:11:44 · Upravil/a: Moderátor (editace znemožněna) 22. 6. 2014, 16:19:29
Abych zbytečne nezakládal nový a nový topici tak to sem ješte hodím, udelal sem si skript na prihlašovaní a nevím zdá je bezpečný, funguje ale buch ví či ho muže nekdo hacknout levou zadnou
Udelal sem to takhle pastebin.com/nyifPs72 Je to prosím bezpečné ? Moderátor jenikkozak: Tohle s předchozími problémy nemá vůbec nic společného. Přesunul jsem konverzaci do nového vlákna.
|
||
juriad Profil |
Není.
Když ti zadám username: 'UNION(SELECT("0bee89b07a248e27c83fc3d5951213c1"))# , tak dotaz vrátí jeden řádek s hashem hesla 0bee89b07a248e27c83fc3d5951213c1 . Hash odpovídá heslu abc .
Ochranou je prohnat username funkcí mysqli_real_escape_string před vložením do SQL dotazu. Tomuto typu útoků se říká SQL Injection. |
||
CZghost Profil |
#3 · Zasláno: 22. 6. 2014, 15:25:44
_fantomas:
$_SESSION['admin'] = $username; |
||
juriad Profil |
#4 · Zasláno: 22. 6. 2014, 15:28:48 · Upravil/a: juriad
CZghost:
Za předpokladu, že identické username je v databázi (takové username je registrované), tak to bezpečné je. Ale jak ukazuji, tak se dokáži přihlásit jako uživatel 'UNION(SELECT("..."))# , který v databázi není.Ještě doplním jeden tématický vtip na zasmání: http://xkcd.com/327/ |
||
_fantomas Profil |
#5 · Zasláno: 22. 6. 2014, 15:36:22
[#13] juriad Nevím čí to testuju správne ale já dal do políčka jmeno
'UNION(SELECT("0bee89b07a248e27c83fc3d5951213c1"))# pak sem skusil ješte priradit ehslo abc a napsalo to že heslo je nesprávne Opravdu nevím jak si to myslel. |
||
juriad Profil |
#6 · Zasláno: 22. 6. 2014, 15:41:09
Aha, jiná implementace MD5, zřejmě.
Zkus uživatele 'UNION(SELECT(MD5("abc")))# s heslem abc .
|
||
CZghost Profil |
#7 · Zasláno: 22. 6. 2014, 15:42:09
juriad:
„Ještě doplním jeden tématický vtip na zasmání“ Tak ten je dobrej :D |
||
_fantomas Profil |
#8 · Zasláno: 22. 6. 2014, 15:44:09 · Upravil/a: _fantomas
Jop už to vidím, no a jak mam tedy to jmeno
"zastringovat"? Mám tam totíž i funkci preg_replace('/\s+/', '' Muže to byt takhle? $username = mysqli_real_escape_string(preg_replace('/\s+/', '', $_POST['username'])); Hm nemuže, jak to tam mam dat? |
||
juriad Profil |
#9 · Zasláno: 22. 6. 2014, 15:48:12
$result = mysqli_query($db, "SELECT password FROM admins WHERE username='" . mysqi_real_escape_string($username) . "'"); A toto musíš provádět na každém místě, kde do dotazu dosazuješ řetězec. Do SESSION chceš uložit původní username. |
||
_fantomas Profil |
#10 · Zasláno: 22. 6. 2014, 15:49:57 · Upravil/a: _fantomas
dekuji mnohokrat a jinak skript je už v bezpečí?
Nefaká to $result = mysqli_query($db, "SELECT password FROM admins WHERE username='" . mysqli_real_escape_string($username) . "'"); už to jede ale píšto to chybu, minemad.eu |
||
juriad Profil |
#11 · Zasláno: 22. 6. 2014, 15:59:59
Samozřejmé, že té funkci chybí první parametr:
$db . Omlouvám se.
|
||
_fantomas Profil |
#12 · Zasláno: 22. 6. 2014, 16:23:14
Pokoušel sem se ale nejak to nejde, nemužeš mi to sem hodit?
|
||
juriad Profil |
#13 · Zasláno: 22. 6. 2014, 16:27:42
$result = mysqli_query($db, "SELECT password FROM admins WHERE username='" . mysqli_real_escape_string($db, $username) . "'"); |
||
_fantomas Profil |
#14 · Zasláno: 22. 6. 2014, 16:35:32
juriad:
dík, do toho skript volam to $db z head.php kterej je
v <head> </head> Mam tam pripojení k MySQL a proto nemusím sto krat napajen Databazi, je to ale zdá bezpečné voči tomuto skriptu a všem ostatním? |
||
Lamicz Profil |
#15 · Zasláno: 22. 6. 2014, 20:09:03
_fantomas:
> dík, do toho skript volam to $db z head.php kterej je > v > <head> > </head> Znáš v PHP pojem "function" a "include/require"? |
||
Medvídek Profil |
juriad:
„Ještě doplním jeden tématický vtip na zasmání: ht>tp://xkcd.com/327/“ To mi připomíná toto: http://img.gawkerassets.com/img/18mpenleoksq8jpg/ku-bigpic.jpg :) _fantomas: if(empty($username)) { $error = '<span style="color: red;"> Chyba: Musíte vyplniť meno.</span>'; } if(empty($password)) { $error = '<span style="color: red;"> Chyba: Musíte vyplniť heslo.</span>'; } if(empty($password) || empty($username)) { $error = '<span style="color: red;"> Chyba: Musíte vyplniť všetky polia.</span>'; } Tohle ti vždycky vypíše 2 hlášky (v krajním případě i 3), je to nutné? Jinak za přesměrováním dávej vždycky exit, jinak se vykoná i zbytek kódu (což je často nechtěné) header("Location: http://minemad.eu/adminka"); exit(); |
||
Jcas Profil |
#17 · Zasláno: 22. 6. 2014, 22:11:37
Medvídek:
Já myslím, že mu to vždy vypíše jednu jedinou hlášku. if(empty($password) || empty($username)) |
||
jenikkozak Profil |
#18 · Zasláno: 22. 6. 2014, 22:26:20
Pokud obě proměnné neobsahují žádnou hodnotu, vypíší se 3 hlášky.
Pokud hodnotu neobsahuje jedna z nich, vypíší se 2 hlášky. Ta třetí podmínka je splněna, pokud je proměnná $password prázdná, proměnná $username prázdná, nebo jsou prázdné obě dvě. |
||
Medvídek Profil |
#19 · Zasláno: 22. 6. 2014, 22:28:00
Jcas:
Pokud zapomeneš vypnit heslo, tak projde tato podmínka: if(empty($password)) { $error = '<span style="color: red;"> Chyba: Musíte vyplniť heslo.</span>'; } if(empty($password) || empty($username)) { $error = '<span style="color: red;"> Chyba: Musíte vyplniť všetky polia.</span>'; } v nejhorším případě, když neyplníš nic, tak ti to napíše: Chyba: Musíte vyplniť meno. Chyba: Musíte vyplniť heslo. Chyba: Musíte vyplniť všetky polia. |
||
juriad Profil |
#20 · Zasláno: 22. 6. 2014, 22:34:02
jenikkozak, Medvídek:
Proměnná $error se přepisuje, tedy vždy bude vidět jen jedna hláška - ta poslení. Jelikož empty($password) || empty($username) je splněná, když je splněná i některá předchozí hláška, tak se vždy vypíše tato. Jcas má pravdu.
|
||
Medvídek Profil |
juriad:
Pravdu máš, to jsme přehlédli, ale v tom případě jsou první dvě podmínky naprosto k ničemu, jelikož se přepíšou tou poslední. Čili poslední podmínka, aby dávala smysl by měla být: if(empty($password) AND empty($username)) |
||
juriad Profil |
#22 · Zasláno: 23. 6. 2014, 11:20:45
Ještě jedna poznámka k bezpečnosti: není vhodné používat funkci MD5.
http://cz1.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash |
||
_fantomas Profil |
#23 · Zasláno: 23. 6. 2014, 16:51:51
Skript mi vypíše vždy 1 hlášku, a co to pripojení? nikdo se moc nevyjadril, je vhodné to dávat do hlavičky a mít vždy jen jedno pripojení?
|
||
juriad Profil |
#24 · Zasláno: 23. 6. 2014, 17:00:52
_fantomas:
Ne do hlavičky, lepší je to umístit zvlášť třeba do souboru databaze.php, který slouží jen pro připojení, a na každé stránce, která vyžaduje připojení k databázi tento soubor requirenout někde na začátku, klidně ještě před <html> . A ano, je naopak vysoce žádoucí použít jedno jediné databázové připojení pro všechny dotazy.
Ohledně té jediné hlášky, nahraď tu podmínku za: if(empty($password) && empty($username)) |
||
_fantomas Profil |
#25 · Zasláno: 23. 6. 2014, 17:02:30
jaky je prosím rozdíl mezi ||, AND, && ?
|
||
juriad Profil |
||, or znamená „nebo“
&&, and znamená „a zároveň“ Slovní a znakové varianty se liší prioritou. Já osobně doporučuji používat jen && a || až na případy, kdy nutně vyžaduji nižší prioritu. Nedávno tu o tom byla diskuse, zkusím ji najít. Nalezeno: Jak na dvě podmínky if správně? |
||
_fantomas Profil |
#27 · Zasláno: 23. 6. 2014, 17:09:21
Skusil sem dát heslo do sha takhle
if($vysledok['password'] == hash('sha512', $password)) ale nejak to nemaká, v čem je problém? |
||
juriad Profil |
_fantomas:
Protože v databázi již máš hesla uložena jako MD5 hash, tedy musíš všude použít MD5. Nebo všechny uživatele přeregistrovat. Nemyslím si však, že toto je vážná chyba v zabezpečení, útočník by musel vědět, že používáš MD5 hash (ok, my to již víme) a musel by vědět, jaký hash hesla má uživatel uložen v databázi. Potom je teoreticky možné vypočítat jiné heslo, které má stejný hash a je tedy od původního hesla nerozlišitelné. Aby tento útok mohl být úspěšný, musel by útočník vědět hash hesla existujícího uživatele a ten se nedozví, pokud není bezpečnostní díra ještě někde jinde. Teoreticky = silně nepraktické. Může to trvat týdny. |
||
_fantomas Profil |
#29 · Zasláno: 23. 6. 2014, 17:19:36 · Upravil/a: _fantomas
práveže sem heslo v databazi upravil na SHA512 a nejak to nechce jít
jinak ten odkaz co jsi mi posílal koukam že tam má endif u neuplne podmínky, mam to také používat? protože v tom skriptu co sem poslal sou tam skoro samé neuplné podmínky. |
||
juriad Profil |
Tak zkus zda v PHP
hash('sha512', $moje_heslo) dává stejný výsledek jako SELECT SHA2("$moje_heslo", 512) v databázi. Máš dostečně dlouhý sloupeček pro ukládání hesla? Tento hash je délší než MD5. Máš dostatečně novou verzi MySQL, starší tento hash neuměly.
Jsou dva způsoby zápisu podmínek (a cyklů a switchů): if (podminka) { # tady se něco děje } if (podminka): # tady se něco děje endif; Vyber si, co ti vyhovuje (ale používej to konzistentně), většina lidí preferuje první možnost. Osobně by mě zajímalo, kde se lidé o té druhé možnosti dozvídají... |
||
Téma pokračuje na další straně.
|
0