2016-05-03 13 views
0

Ich bin total neu zu PHP und mySQL und ich baute ein kleines Login-Formular für meine Website. Da die Beschreibungen im Internet für solch eine Sache viel umfangreicher sind, möchte ich Sie nur fragen, ob dies eine sichere Möglichkeit ist, es zu tun, da es nur ein paar Zeilen war und es funktioniert:PHP und mySQL Login Sicherheit Zweifel

Zuerst erstelle ich ein Tabelle in phpMyAdmin mit Benutzername und Passwort (Hash mit MD5). Danach starte ich den Login auf der Website mit dem folgenden Skript, wo die $_POST Sachen von einem Formular kommen.

<?php 
    session_start(); 
    $db = @mysqli_connect("...", "...", "...") or 
    die("Connection failed!"); 
    mysqli_select_db($db,'...'); 
    if(isset($_POST['username'])) 
    { 
     $_SESSION['user'] = $_POST['username']; 
     $_SESSION['password'] = md5($_POST['password']); 
     $user = $_SESSION['user']; 
     $password = $_SESSION['password']; 
     $sql = "SELECT * FROM logins WHERE username = \"$user\""; 
     $result = $db->query($sql); 
     $row = $result->fetch_assoc(); 
     if($row["password"] == $password) 
     { 
      $_SESSION['logged'] = "loggedin"; 
     } 
    } 
?> 

Das Logout-Skript ist sehr einfach.

<?php 
    session_start(); 
    session_destroy(); 
    unset($_SESSION['user']); 
    unset($_SESSION['password']); 
    header('Location: ../index.php'); 
?> 

Außerdem beschränke ich jeden private Inhalte mit

<?php 
    if (isset($_SESSION['logged'])) 
    { 
     $temp = $_SESSION["user"]; 
     echo "Hello $temp, nice to see you!"; 
    } 
?> 

oder ich eine Umleitung zu machen.

hier sind also meine Fragen:

  1. Ist dies ein sicherer Weg, es zu tun? Kann es leicht gehackt werden?
  2. Welchen Sinn macht MD5, wenn eine reverse lookup möglich ist?

Vielen Dank!

+3

Die erste Frage ist wahrscheinlich besser geeignet für [Code Review] (http://codereview.stackexchange.com/) –

+2

Sie sollten [MD5 Passwort Hashes] (http: //security.stackexchange) nicht verwenden.com/questions/19906/is-md5-assered-unsichere) und Sie sollten wirklich PHP [integrierte Funktionen] (http://jayblanchard.net/proper_password_hashing_with_PHP.html) verwenden, um die Passwortsicherheit zu behandeln. Stellen Sie sicher, dass Sie [Passwörter nicht umgehen] (http://stackoverflow.com/q/36628418/1011527) oder verwenden Sie einen anderen Bereinigungsmechanismus vor dem Hashing. Wenn Sie dies tun, * ändert * das Passwort und verursacht unnötige zusätzliche Codierung. –

+1

[Little Bobby] (http://bobby-tables.com/) sagt [Ihr Skript ist für SQL Injection Attacks gefährdet.] (Http://stackoverflow.com/questions/60174/how-can-i-prevent -sql-injection-in-php) Erfahren Sie mehr über [vorbereitete] (http://en.wikipedia.org/wiki/Prepared_statement) Anweisungen für [MySQLi] (http://php.net/manual/en/mysqli.quickstart .prepared-statements.php). Sogar [die Zeichenfolge zu entkommen] (http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) ist nicht sicher! –

Antwort

2

Sie müssen eine Menge Arbeit vor sich haben. Hier sind einige gute Startpunkte. Nehmen Sie die Ideen von hier und von Google, denn es gibt viele Informationen, die Sie erschließen müssen.

Für wie sowohl Server und senden Sie die Seite hier Is HTTPS as the form's action enough?

Für wie hier Hash sehen (zur Zeit meiner Wahl) Password Hashing Functions

Schließlich lesen Sie auf Formularprüfung und Eingabe eine gute SO Post Hygienisierung ist What's the best method for sanitizing user input with PHP?

auch als einer der Kommentare in Blick weist darauf hin, Prepared Statements

Hoffnung, dies hilft Ihnen auf Ihrer Reise gestartet.

1

Sie haben keinerlei Sicherheit, da Sie sowohl den Benutzernamen als auch das Passwort POST haben. Sie werden über das Internet im Klartext gesendet, es sei denn, Sie verwenden HTTPS. Die MD5-Codierung ist auch ziemlich nutzlos.

Eine sicherere Art wäre, das Passwort VOR dem POST zu verschlüsseln, idealerweise mit einem ablaufenden Zeitstempel, so dass es nach x Zeit nicht wiederverwendet werden kann.

Auch verwendet Ihre SQL-Anweisung eine gepostete Wert ohne desinfizierende, diese Ihrer Datenbank SQL-Injection macht ...

Bitte verwenden Sie den Code nicht auf eine strategische Datenbank.