« 1 2 »
Autor Zpráva
_fantomas
Profil
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
_fantomas:
$_SESSION['admin'] = $username;
To přiřazuješ session hodnotu uživatelského jména? Nevím, jak to přesně funguje, ale tohle také nevypadá moc bezpečně...
juriad
Profil
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
[#13] juriad Nevím čí to testuju správne ale já dal do políčka jmeno

'UNION(SELECT("0bee89b07a248e27c83fc3d5951213c1"))#
a nic se nedeje, napíše to že mam vyplnit všechny pole
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
Aha, jiná implementace MD5, zřejmě.
Zkus uživatele 'UNION(SELECT(MD5("abc")))# s heslem abc.
CZghost
Profil
juriad:
Ještě doplním jeden tématický vtip na zasmání
Tak ten je dobrej :D
_fantomas
Profil
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
$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
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
Samozřejmé, že té funkci chybí první parametr: $db. Omlouvám se.
_fantomas
Profil
Pokoušel sem se ale nejak to nejde, nemužeš mi to sem hodit?
juriad
Profil
$result = mysqli_query($db, "SELECT password FROM admins WHERE username='" . mysqli_real_escape_string($db, $username) . "'");
_fantomas
Profil
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
_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í: http://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
Medvídek:
Já myslím, že mu to vždy vypíše jednu jedinou hlášku.
if(empty($password) || empty($username))
jenikkozak
Profil
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
Jcas:
Pokud zapomeneš vypnit heslo, tak projde tato podmínka:
if(empty($password))
{
           $error = '<span style="color: red;"> Chyba: Musíte vyplniť heslo.</span>';
}
a ještě tato (která zabere ždy, když je něco neyplněného)
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
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
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
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
_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
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
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
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í...
« 1 2 »

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: