Autor | Zpráva | ||
---|---|---|---|
dramos Profil |
#1 · Zasláno: 20. 4. 2014, 20:43:02
Dobrý večer, vytvořil jsem kdysi webové stránky s administrací, do které se přihlašovalo prostřednistvím uživatelského jména a hesla, jméno a heslo se ověřuje přes mysql databázi, heslo je šifrováno přes md5. Přihlašeným se vytvoří $_SESSION['login'], které když má hodnotu 1, tak uživatel může vstoupit do administrace.
Teď mi přišel tento mail: Při náhodném procházení internetu jsem neúmyslně narazil na bezpečnostní chybu na vašem webu ***. Bez znalosti přihlašovacích údajů je možné se přihlásit do administrace (zasílám screeny) a tím v podstatě znehodnotit infromace na webu zveřejněné. V krajním případě by vás případný útočník mohl i výrazně poškodit. přiložené screeny jsou skutečně z administrace webu. Vím, že bych měl stránky lépe zabezpečit, že používání session není moc bezpečné, ale nevím jaké jsou možnosti, nebo co je nejlepší řešení, poradí někdo? předem děkuji |
||
juriad Profil |
#2 · Zasláno: 20. 4. 2014, 20:49:36
Bez konkrétního kódu nelze nic poradit. A máš štěstí, že ti přišel jen mail, také to mohlo dopadnout hůře.
|
||
dramos Profil |
#3 · Zasláno: 20. 4. 2014, 20:51:18
Přikládám kód
include "../includes/conn.php"; $login = $_POST["uzivatel"]; $heslo = $_POST["heslo"]; $md5heslo = md5($heslo); $dotaz = mysql_query("select * from uzivatele where uzivatel = '$login' and heslo = '$md5heslo'"); $overeni = mysql_num_rows($dotaz); $row = mysql_fetch_array($dotaz); if($overeni == 1) { $_SESSION['login'] = $login; $_SESSION['login2'] = "1"; $_SESSION['id'] = $row["id"]; header("Location: main.php"); die(); } else { echo 'bylo zadáno špatné heslo!'; } |
||
Bubák Profil |
#4 · Zasláno: 20. 4. 2014, 20:57:02
Mi to připadá jako Neukoncene-presmerovani.
|
||
juriad Profil |
Zadej jako login přesně:
' OR 1=1 -- select * from uzivatele where uzivatel = '' OR 1=1 --' and heslo = 'abcd1234abcd1234' To způsobí, že řetězec se ukončí předčasně; náslesledně OR 1=1 způsobí, že bude podmínka splněna vždy a -- je komentář, který způsobí ignorování zbytku dotazu. Do všech dotazů musíš zadávat všechny řetězce escapované pomocí mysql_real_escape_string. <?php $dotaz = mysql_query("select * from uzivatele where uzivatel = '" . mysql_real_escape_string($login) . "' and heslo = '" . mysql_real_escape_string($md5heslo) . "'"); |
||
Rfilip Profil |
#6 · Zasláno: 20. 4. 2014, 21:00:21
Typický případ SQL injection. Zkuste si do políčka jméno dát
' OR 1=1-- . a uvidíte sám. Oprava dejte $login = mysql_real_escape_string ($login); na 5 řádek.
|
||
juriad Profil |
#7 · Zasláno: 20. 4. 2014, 21:03:47
Rfilip:
Chybně. Pak se mu pro databázi escapovaný login uloží do SESSION. A při následném vypisování do stránky může obsahovat nadbytečná zpětná lomítka a apostrofy. |
||
Rfilip Profil |
#8 · Zasláno: 20. 4. 2014, 21:04:42
Aha, tak to jsem nedomyslel. Díky za informaci
|
||
dramos Profil |
#9 · Zasláno: 20. 4. 2014, 21:25:47
Všem moc děkuji za pomoc
|
||
Časová prodleva: 10 let
|
0