2009-03-26 4 views
8

So kürzlich lernte ich, wie man einen Benutzernamen und ein Kennwort zu einer Datenbank richtig hinzufügt. Meine Datenbank ist usersys, und die Tabelle, die Benutzerinformationen speichert, wird userdb genannt. Die Tabelle hat zwei Spalten - Benutzername (primär), Passwort.Wie authentifiziere ich einen Benutzer in PHP/MySQL?

Das Anmeldeformular funktioniert gut, gibt die Benutzereingaben in die Datenbank korrekt ein und prüft auch, ob der Benutzername des Benutzers bereits in der Datenbank ist oder nicht.

Mit diesem gesagt, ich frage, ob jemand mir helfen könnte, ein Login-Skript zu erstellen. So weit, das ist was ich habe:

$username = $_POST['username']; 
$password = $_POST['password']; 
$displayname = $_POST['username']; 
$displayname = strtolower($displayname); 
$displayname = ucfirst($displayname);   
echo "Your username: " . $displayname . "<br />"; 

mysql_connect("localhost", "root", "******") or die(mysql_error()); 
echo "Connected to MySQL<br />"; 

mysql_select_db("usersys") or die(mysql_error()); 
echo "Connected to Database <br />"; 

$lcusername = strtolower($username); 
$esclcusername = mysql_real_escape_string($lcusername); 
$escpassword = mysql_real_escape_string($password); 

$result = mysql_query("SELECT * FROM userdb WHERE username='$esclcusername' AND  password='$escpassword'") or die(mysql_error()); 
$row = mysql_fetch_array($result); 
$validateUser = $row['username']; 
$validatePass = $row['password']; 

Die POST-Daten stammen von der vorherigen Anmeldeseite. Ich möchte, dass dieses Skript die Tabelle (userdb) überprüft und die Zeile für den Benutzernamen findet, die der Benutzer aus dem vorherigen Formular eingegeben hat, und überprüfen, ob das eingegebene Passwort mit dem in dieser Zeile in der userdb-Tabelle festgelegten Passwort übereinstimmt.

Ich möchte auch eine Art von Möglichkeit zu prüfen, ob oder ob nicht, wenn der Benutzername eingegeben wird, um dem Benutzer mitzuteilen, dass der eingegebene Benutzername nicht existiert, wenn es nicht in der Tabelle gefunden werden kann.

+0

folgt sollten Sie einen vorhandenen Authentifizierungs-Framework, wann immer möglich wieder verwenden, weil wirklich, es komplex ist. Sehen Sie sich zum Beispiel https://github.com/delight-im/PHP-Auth an, das sowohl framework-agnostisch als auch datenbankunabhängig ist. – caw

Antwort

7

Sie können Sitzungen verwenden. Sitzungen sind globale Variablen, die, wenn sie festgelegt werden, beim Browsen durch die Site beim Benutzer bleiben.

Da lernen Sie PHP, try out this tutorial auf der offiziellen Website.

Aber was Sie in der Theorie tun würde, ist, wenn der Benutzername und das Passwort übereinstimmen, setzen Sie eine Session-Variable

$_SESSION["auth"] = true; 
$_SESSION["user_id"] = $row["user_id"]; 

Und tun Sie dann eine Prüfung, um zu sehen, ob der Benutzer authentifiziert ist.

3

Eine Möglichkeit, es (: nicht unbedingt Best-Practice HAFTUNGSAUSSCHLUSS): zu tun

$result = mysql_query("SELECT id FROM userdb WHERE username='$esclcusername' AND password='$escpassword'") or die(mysql_error()); 
$row = mysql_fetch_array($result); 
$id = (int)$row['id']; 
if($id > 0) { 
    //log in the user 
    session_start(); 
    $_SESSION['userId'] = $id; 
    $_SESSION['username'] = $displayname; 
} 

... und auf den Seiten, die eine Authentifizierung erfordern:

session_start(); 
if(!isset($_SESSION['userId'])) { 
    die('You need to be logged in!!!'); 
} else { 
    echo 'Welcome ' . $_SESSION['username']; 
} 

Lesen Sie mehr über PHP sessions.

0

Sie könnten eine select-Anweisung verwenden, um das Passwort für den angegebenen Benutzernamen von MySQL abzurufen. Wenn Sie ein leeres Ergebnis festgelegt haben, haben Sie keinen Benutzernamen in der Tabelle.

Wenn Sie möchten, dass der Benutzer in mehr als einer PHP-Seite authentifiziert wird, dann kann eine Option Sitzungen verwenden (http://www.php.net/manual/en/function.session-start.php).

Außerdem glaube ich, Sie über die Sicherheit denken sollte, das heißt zu verhindern SQL-Injection:

$variable = mysql_real_escape_string($_POST['variable']) 

und die Vermeidung von „sterben“ (Fehler behandeln und benutzerfreundliche Nachrichten vom Skript zurückkehrt).

0

Ich würde auch darüber nachdenken, keine Passwörter in Ihrer Datenbank zu speichern. Einweg-Hashes mit MD5 oder SHA1 sind eine Möglichkeit, eine Sicherheitsschicht auf der db-Ebene hinzuzufügen.

Weitere Informationen finden Sie unter http://php.net/md5 oder http://php.net/sha1.

12

Dies ist keine direkte Antwort auf diese Frage, aber ein guter Mehrwert. Sie sollten die MYSQL SHA1-Funktion verwenden, um das Kennwort vor dem Speichern in der Datenbank zu verschlüsseln.

$user = $_POST['userid']; 
$pwd = $_POST['password']; 
$insert_sql = "INSERT into USER(userid, password) VALUES($user, SHA1($pwd))"; 

$select_sql = "SELECT * FROM USER WHERE userid=$user AND password=SHA1($pwd))"; 
+2

+1 für einen sehr wichtigen Punkt. Zwei Korrekturen allerdings: 1. Der Code sollte mysql_escape_string/mysql_real_escape_string() verwenden, um zu vermeiden, dass SQL-Injections umgangen werden. 2. Es wird bevorzugt, ein Salz für das Hashing zu verwenden, um zu vermeiden, dass es von Rainbow-Tischen geknackt wird. Siehe: http://tinyurl.com/jwb8o – Fredrik

+0

Diese Antwort ist hauptsächlich unsicher, weil sie keine Anführungszeichen um das Passwort verwendet, obwohl die Hauptfrage die Verwendung der mysql escape-Funktion zeigt, dies ermöglicht dennoch SQL-Injektionen in der Form von '$ pwd =" 1) OR (1 = 1 "' – Ferrybig

2

Ich mag beide verwenden $_SESSION und MYSQL Schecks bei jeder Login POST. Dies sollte helfen, ein paar Dinge zu beginnen.

$username = mysql_real_escape_string($_POST[username]); 
$password = strip_tags($_POST[password]); 
$password = sha1($password); 

if(isset($username) && isset($password) && !empty($username) && !empty($password)) 
{ 
$sql = mysql_query("SELECT * FROM users_column WHERE username = '$username' AND password = '$password'"); 

//Check the number of users against database 
//with the given criteria. We're looking for 1 so 
//adding > 0 (greater than zero does the trick). 
$num_rows = mysql_num_rows($sql); 
if($num_rows > 0){ 

//Lets grab and create a variable from the DB to register 
//the user's session with. 
$gid = mysql_query("SELECT * FROM users_column WHERE username = '$username' AND password = '$password'"); 
$row = mysql_fetch_assoc($gid); 
$uid = $row[userid]; 

// This is where we register the session. 
$_SESSION[valid_user] = $uid; 

//Send the user to the member page. The userid is what the 
//session include runs against. 
header('Location: memberpage.php?userid='.$userid); 
} 

//If it doesn't check out -- throw an error. 
else 
{ 
echo 'Invalid Login Information'; 
} 
} 

HINWEIS: Sie müßten die Auslagerungsdatei mit session_start() und erstellen Sie eine separate Session prüft dahingehend enthalten, mit session_start() beginnen und Ihren Progressionen dann z.B. if($_SESSION[valid_user] != $userid) etwas tun.

0

Ich stimme der Idee, wenn Sie SESSION-Variablen bei der Authentifizierung des Benutzers verwenden.

Der einfache Weg ist, den Benutzer zu authentifizieren, wie

//connect the mysql_db 
$mysql_connect() 
$mysql_select_db() 

//reading from mysql table 
$res="SELECT * FROM table WHERE name=$username AND password=$password"; 
$val=mysql_query($res); 

//authentication 
$count=mysql_num_rows($val); 
if($count==1) 
//authenticate the user 
else 
through an error 
+0

Diese Antwort ist hauptsächlich unsicher, weil sie keine Anführungszeichen um das Passwort verwendet, obwohl die Hauptfrage die Verwendung der mysql-Escape-Funktion anzeigt, dies aber weiterhin erlaubt für SQL-Injektionen in Form von $ password = "1OR1 = 1" ' – Ferrybig

Verwandte Themen