Hallo,

Ik heb een registratieformulier aangemaakt, en gebruikers kunnen hun gebruikersnaam en wachtwoord gewoon opgeven. En deze worden dan in de mysql database opgeslagen.

Ik gebruik niet meer dan volgende regel hiervoor.
mysql_query("INSERT INTO users (username, password) VALUES ('$username','$password')");

Maar de wachtwoorden worden gewoon als tekst opgeslagen in mijn mysql tabel(varchar). Hoe kan ik dit beter beveiligen zodat het wachtwoord gehashed word. En hoe unhash in het terug zodat ze nog wel steeds kunnen aanmelden?

Thanks!
Na header() zal het script niet direct stoppen.
Om dat te forceren gebruik je exit().
Sorry, mijn veld admin staat voor 1 user op "yes" in de database (varchar):
Ik kan nu met geen enkele gebruiker meer aanloggen.
Met verkeerde username => wit scherm
Met verkeerd wachtwoord => incorrect password (lijkt me dus goed)
Met juiste credentials + admin op yes => incorrect username
Met juiste crendentials zonder admin op yes => acces denied


<?php
include("password.php");
session_start();
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$bool = true;

mysql_connect("localhost", "root", "usbw") or die (mysql_error()); //Connectie naar de server
mysql_select_db("first_db") or die ("Cannot connect to database"); //Connect naar de database
$query = mysql_query("Select * from users WHERE username='$username'"); // Query de users tabel
$exists = mysql_num_rows($query); //checked of de gebruikersnaam bestaat
$table_users = "";
$table_password = "";
if($exists > 0) //Als er geen resultaten zijn of geen bestaande username is
{
while($row = mysql_fetch_array($query)) // Toont alle rijen van de query
{
$table_users = $row['username']; // De eerste gebruikersnaam rij word doorgegeven naar $table_users, en hij doet dat tot heel de query is afgelopen
$table_password = $row['password']; // De eerste wachtwoorden rij word doorgegeven naar de $table_password, en hij doet dat tot heel de query is afgelopen
$admin = $row['admin'];
}
if ($admin == 'yes') {
if(($username == $table_users) && password_verify($password, $table_password) && ($admin == 'yes'))// checked of er een match is
{

if ($password == $table_password) {
$_SESSION['user'] = $username;
$_SESSION['admin'] = $admin;
header("location: home.php");



} else {
print '<script>alert("Incorrect username!");</script>';
print '<script>window.location.assign("login.php");</script>';
}
} else {
print '<script>alert("Incorrect Password!");</script>';
print '<script>window.location.assign("login.php");</script>';
}
} else {
print '<script>alert("Acces denied!");</script>';
print '<script>window.location.assign("login.php");</script>';
}
}
?>
Het is al eerder gezegd, maar je mysql_real_escape_string moet je NA je databaseconnectie plaatsen. Verder kan je ook prima die functie direct in de query gebruiken, zoals in mijn voorbeeld.

Verder kan je ook prima met booleans (true/false; 1/0) werken in je database om aan te geven of iemand admin is, of niet. Gewoon een 0 (niet) of 1 (wel) gebruiken.

Verder raad ik het niet aan om de status van een admin in de sessie op te slaan. Mocht je iemand ontheffen uit zijn adminfunctie, dan zal hij eerst zijn browser af moeten sluiten. het enige wat in een sessie hoort is een status of iemand ingelogd is als boolean, en zijn userID.
Aar C op 09/03/2015 21:44:29

het enige wat in een sessie hoort is een status of iemand ingelogd is als boolean.


Uhm Aar,

hoe weten we dan WIE er ingelogd is? Lijkt mij dat je toch ook een user_id opslaat in de sessie? Of als alternatief kan ik nog verzinnen dat je het sessie_id opslaat in de database in de users tabel.
Ja, en een userID hoort erin, die was ik vergeten.
Iemand een idee waarom dat script niet werkt?
Sorry, mijn veld admin staat voor 1 user op "yes" in de database (varchar):
Ik kan nu met geen enkele gebruiker meer aanloggen.
Met verkeerde username => wit scherm
Met verkeerd wachtwoord => incorrect password (lijkt me dus goed)
Met juiste credentials + admin op yes => incorrect username
Met juiste crendentials zonder admin op yes => acces denied





<?php
include("password.php");
session_start();
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$bool = true;

mysql_connect("localhost", "root", "usbw") or die (mysql_error()); //Connectie naar de server
mysql_select_db("first_db") or die ("Cannot connect to database"); //Connect naar de database
$query = mysql_query("Select * from users WHERE username='$username'"); // Query de users tabel
$exists = mysql_num_rows($query); //checked of de gebruikersnaam bestaat
$table_users = "";
$table_password = "";
if($exists > 0) //Als er geen resultaten zijn of geen bestaande username is
{
while($row = mysql_fetch_array($query)) // Toont alle rijen van de query
{
$table_users = $row['username']; // De eerste gebruikersnaam rij word doorgegeven naar $table_users, en hij doet dat tot heel de query is afgelopen
$table_password = $row['password']; // De eerste wachtwoorden rij word doorgegeven naar de $table_password, en hij doet dat tot heel de query is afgelopen
$admin = $row['admin'];
}
if ($admin == 'yes') {
if(($username == $table_users) && password_verify($password, $table_password) && ($admin == 'yes'))// checked of er een match is
{

if ($password == $table_password) {
$_SESSION['user'] = $username;
$_SESSION['admin'] = $admin;
header("location: home.php");



} else {
print '<script>alert("Incorrect username!");</script>';
print '<script>window.location.assign("login.php");</script>';
}
} else {
print '<script>alert("Incorrect Password!");</script>';
print '<script>window.location.assign("login.php");</script>';
}
} else {
print '<script>alert("Acces denied!");</script>';
print '<script>window.location.assign("login.php");</script>';
}
}
?>
if(($username == $table_users)

de kans dat de username niet gelijk is aan $table_users is niet zo heel groot: gezien je dit in de query al afdwingt.
Hooguit gaat hier nog wat mis mbt mysql_real_escape_string.


password_verify($password, $table_password)

geen idee wat dit doet? kijken of gehast password in database gelijk is aan de hash van het ingevoerde password (na mishandeling door mysql_real_escape_string) ?

vreemd, want daarna volgt nog een keer
if ($password == $table_password) {

dus we vallen terug op de niet gehashte versie van $password en vergelijken nog een keer.



---
doe je trouwens iets met de aanwijzingen of negeer je alles wat niet direct tot je oplossing leidt?
ik bedoel opmerkingen over eerst connecten, dan escapen, etc.

Zorg eerst eens dat je foutmeldingen gaat krijgen. Zet onderstaande twee regels bovenaan in je script.

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
?>

Daarnaast heb jij wel de laatste reactie van Aar gelezen?
a) mysql_connect
b) mysql_real_escape_string

In die volgorde en niet andersom.
Laat maar weten welke foutmeldingen je krijgt.
Sorry en bedankt voor de reacties. Ik heb de mysql_real_escape_string achter mijn connect gestoken.


error
Notice: Undefined index: username in D:\USBWebserver v8.6\root\restaurant\checklogin.php on line 10

Notice: Undefined index: password in D:\USBWebserver v8.6\root\restaurant\checklogin.php on line 11



Code

<?php
include("password.php");
session_start();

$bool = true;

mysql_connect("localhost", "root", "usbw") or die (mysql_error()); //Connectie naar de server
mysql_select_db("first_db") or die ("Cannot connect to database"); //Connect naar de database

$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$query = mysql_query("Select * from users WHERE username='$username'"); // Query de users tabel
$exists = mysql_num_rows($query); //checked of de gebruikersnaam bestaat
$table_users = "";
$table_password = "";



if($exists > 0) //Als er geen resultaten zijn of geen bestaande username is
{
while($row = mysql_fetch_array($query)) // Toont alle rijen van de query
{
$table_users = $row['username']; // De eerste gebruikersnaam rij word doorgegeven naar $table_users, en hij doet dat tot heel de query is afgelopen
$table_password = $row['password']; // De eerste wachtwoorden rij word doorgegeven naar de $table_password, en hij doet dat tot heel de query is afgelopen
$admin = $row['admin'];
}
if ($admin == 'yes') {
if(($username == $table_users) && password_verify($password, $table_password) && ($admin == 'yes'))// checked of er een match is
{

if ($password == $table_password) {
$_SESSION['user'] = $username;
$_SESSION['admin'] = $admin;
header("location: home.php");



} else {
print '<script>alert("Incorrect username!");</script>';
print '<script>window.location.assign("login.php");</script>';
}
} else {
print '<script>alert("Incorrect Password!");</script>';
print '<script>window.location.assign("login.php");</script>';
}
} else {
print '<script>alert("Acces denied!");</script>';
print '<script>window.location.assign("login.php");</script>';
}
}
?>


Login pagina is niet meer dan dit:

<html>
<body>
<a href="index.php">Terug naar home </a><br/><br/>
<form action="checklogin.php" method="POST">
Vul gebruikersnaam in: <input type="text" name="username" required="required" /> <br/>
Vul wachtwoord in: <input type="password" name="password" required="required" /> <br/>
<input type="submit" value="Login"/>
</form>
</body>
</html>
$_POST['username'] en $_POST['password'] zijn nog leeg.

Daarom raad ik aan om eerst te controleren of er gepost is:


<?php
if($_SERVER['REQUEST_METHOD']=="POST") {
	// er is een formulier verstuurd. Plaats hier de afhandeling, zoals validatie, databasecontrole, sessies aanmaken etc...
} else {
	// toon hier eventueel je formulier. Deze else is niet verplicht.
}
?>

Reageren