Autor Zpráva
marek3
Profil *
Dobrý den,
nedávno jsem vytvořil jednoduché přihlašování pomocí PHP a chtěl bych na něm zapracovat co se týká bezpečnosti. Zde je můj kód:

main_login.php

<form name="form1" method="post" action="checklogin.php">
<tr><td>Zadejte jméno:</td><td> <input value="<?php echo htmlspecialchars($_GET['myusername'], ENT_QUOTES); ?>" autocomplete="off" type="text" id="myusername" size="10" name="myusername"></td></tr>
<tr><td>Zadejte heslo:</td><td> <input value="<?php echo htmlspecialchars($_GET['mypassword'], ENT_QUOTES); ?>" autocomplete="off" type="password" id="mypassword" size="10" name="mypassword"></td></tr>
</table><br>
<input type="submit" name="Submit" value="Přihlásit">
</form>

checklogin.php

<?php

$host="host";
$username="jmeno"; 
$password="heslo"; 
$db_name="databaze"; 
$tbl_name="tabulka"; 


 mysql_connect("$host", "$username", "$password")or die("Chyba při ověřování přihlašovacích údajů"); 
 mysql_select_db("$db_name")or die("cannot select DB");

 
 $myusername=  str_replace(array('<', '>'), array('&lt;', '&gt;'), $_POST['myusername']);
 $mypassword=  str_replace(array('<', '>'), array('&lt;', '&gt;'), $_POST['mypassword']);


 $myusername = stripslashes($myusername);
 $mypassword = stripslashes($mypassword);
 $myusername = mysql_real_escape_string($myusername);
 $mypassword = mysql_real_escape_string($mypassword);

$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'";
 $result=mysql_query($sql);


 $count=mysql_num_rows($result);


if($count==1){

 session_register("myusername");
 session_register("mypassword"); 
 header("location:http://domena.cz/members/$myusername.php");
 }
 else {
 echo "Špatné jméno nebo heslo";
 }

if($myusername == admin )
     {header("location:http://domena.cz/admin.php");}
 else
     {;}

 ?>


Předem díky za názory a nápady na vylepšení...
panther
Profil
marek3:
prolétl jsem to jen v rychlosti, třeba někdo doplní ještě další postřehy:

- do SQL dotazu stačí pouze mysql_real_escape_string(), ty předchozí operace s proměnnou jsou zbytečné.

- session_register je deprecated.

- na ř. 40 ti chybí apostrofy, nebo dolar, je-li to proměnná
- na ř. 41 za header by mělo být ukončení scriptu (pokaždé)

V souboru $myusername.php máš, předpokládám, ověření existence té proměnné na začátku, abych na tu URL rovnou nemohl jít, že?
Alphard
Profil
Heslo není hashované a určitě ho neukládat do sessions.
marek3
Profil *
panther:
Jasně, ověření následujícím kódem:

<?php 
 session_start();
 if(!session_is_registered(myusername)){
 header("location:http://domena.cz/main_login.php");
 }
?>

Jinak díky za nápady naa vylepšení...
Ugo
Profil
ř. 10,11 - proměnné není nutné psát s uvozovkami a na rovinu to vypadá hrozně a mě konkrétně to vytáčí když to vidím, pokud ti jde o přetypování, hezčí je (string)$var - ale tady to není nutné

ř. 23 zbytečná proměnná $sql - pro úcely debugu ok
ř.27 zbytečná proměnná $count
ř.42 - zbytečná větev else

z druhého kódu vidím - session_is_registered(myusername). Nahraď za isset($_SESSION['myusername']), tady chybějící die() za přesměrováním je celkem nebezpečné. (jestli chápu kód)

a obecně-
echo ahoj; // bude fungovat, ale pokusí se vyhledat konstantu ahoj nejprve - takže asi pomalejší a vyhodí notice (takže string patří do uvozovek / apostrofu vždy)

to jsou jen postřehy ke zde prezentovanýmu kódu, k přihlášení vše bylo řečeno asi, hashovat, neukládat do session

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:

0