Autor Zpráva
dramos
Profil
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
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
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
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'
Zbýrazněná část je komentář.

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
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
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
Aha, tak to jsem nedomyslel. Díky za informaci
dramos
Profil
Všem moc děkuji za pomoc

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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