login controle
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?
$username = mysql_query ("SELECT username FROM users WHERE username = '" . mysql_real_escape_string ($_POST['username']) . "'") or die (mysql_error ());
if (mysql_num_rows ($username) == $_POST['username']){
}
?>
$username = mysql_query ("SELECT username FROM users WHERE username = '" . mysql_real_escape_string ($_POST['username']) . "'") or die (mysql_error ());
if (mysql_num_rows ($username) == $_POST['username']){
}
?>
1. Je gebruikt een foutafhandeling, maar geen nette.
2. mysql_num_rows geeft het aantal resultaten terug als string (number of rows). Je moet dus kijken of dit 1 of meer is. Dus ipv $_POST['username'], doe je m_n_r($query) == 1
3. Is er een reden dat je de "oude" mysql_* functies gebruik?
Nee, want mysql_num_rows() geeft een aantal of FALSE terug, nooit de username.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?
$username = mysql_query ("SELECT username FROM users WHERE username = '" . mysql_real_escape_string ($_POST['username']) . "'") or echo ('could not query');
if (mysql_num_rows ($username) == 1){
}
?>
$username = mysql_query ("SELECT username FROM users WHERE username = '" . mysql_real_escape_string ($_POST['username']) . "'") or echo ('could not query');
if (mysql_num_rows ($username) == 1){
}
?>
Zorg uiteraard wel voor goede foutafhandeling, want die() hoor je nooit te gebruiken.
Chris Horeweg op 10/01/2012 10:43:34:
3. Is er een reden dat je de "oude" mysql_* functies gebruik?
Chris,
Is daarvoor een betere manier dan?
Ik maak mijn query ook altijd zo, en volgens de geleerden op PFZ zal dit de juiste manier zijn. Hoor graag enige argumenten er over.
Of je moet op de foutafhandeling or die() doelen. Deze gebruik ik niet.
Gewijzigd op 10/01/2012 11:00:09 door Frank WD
De PHP-MySQL functies zullen niet meer worden geupdate, gebruik het vernieuwde MySQLi object of PDO :)
Toevoeging op 10/01/2012 13:27:06:
dit is zeker niks he?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?
$username = mysql_query ("SELECT username FROM users WHERE username = '" . mysql_real_escape_string ($_POST['username']) . "'") or die ('could not query');
$password = mysql_query ("SELECT password FROM users WHERE password = '" . mysql_real_escape_string md5(($_POST['password']) . "'")) or die ('could not query');
$result_user = mysql_num_rows($username);
$result_pass = mysql_num_rows($password);
if ($result_user + $result_pass == 2) {
?>
$username = mysql_query ("SELECT username FROM users WHERE username = '" . mysql_real_escape_string ($_POST['username']) . "'") or die ('could not query');
$password = mysql_query ("SELECT password FROM users WHERE password = '" . mysql_real_escape_string md5(($_POST['password']) . "'")) or die ('could not query');
$result_user = mysql_num_rows($username);
$result_pass = mysql_num_rows($password);
if ($result_user + $result_pass == 2) {
?>
http://www.phphulp.nl/php/tutorial/overig/pdo-verbinden-met-verschillende-databases/534/
Een duidelijke tutorial over hoe PDO werkt, echt een aanrader.
Verder over je laatste post, je moet wel selecteren op de combinatie (username, password) want anders kan ik inloggen met mijn wachtwoord en iemand anders zijn username en dat willen we natuurlijk niet hé ;)
Een duidelijke tutorial over hoe PDO werkt, echt een aanrader.
Verder over je laatste post, je moet wel selecteren op de combinatie (username, password) want anders kan ik inloggen met mijn wachtwoord en iemand anders zijn username en dat willen we natuurlijk niet hé ;)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$con = ...; //db connectie
//eerst even de query in elkaar zetten
$query = "SELECT userID FROM users WHERE username = .. AND password = ..";
//daarna uitvoeren
$result = mysql_query($query,$con);
if(!$result){
//dit is natuurlijk geen mooie foutafhandeling, je wilt gewoon een duidelijke foutmelding tonen
echo 'We hebben een fout in de query! <br />' . mysql_error($con);
exit();
}
//en dan kijken of we een resultaat hebben bijvoorbeeld
if(mysql_num_rows($result) > 0){
//zet de taart maar klaar
$_SESSION['loggedin'] = true;
}else{
//volgens mij bestaat deze combinatie niet
echo 'foei!';
}
?>
$con = ...; //db connectie
//eerst even de query in elkaar zetten
$query = "SELECT userID FROM users WHERE username = .. AND password = ..";
//daarna uitvoeren
$result = mysql_query($query,$con);
if(!$result){
//dit is natuurlijk geen mooie foutafhandeling, je wilt gewoon een duidelijke foutmelding tonen
echo 'We hebben een fout in de query! <br />' . mysql_error($con);
exit();
}
//en dan kijken of we een resultaat hebben bijvoorbeeld
if(mysql_num_rows($result) > 0){
//zet de taart maar klaar
$_SESSION['loggedin'] = true;
}else{
//volgens mij bestaat deze combinatie niet
echo 'foei!';
}
?>
Gewijzigd op 10/01/2012 13:47:19 door Jelle -
Probeer voor de grap die query maar eens op de database uit te voeren :)
En voor het escapen (mysql_real_escape_string()) gebruik je dus prepared statements bij PDO.
Gewijzigd op 10/01/2012 14:46:14 door Jelle -
Parse error: syntax error, unexpected '.'
Mijn advies is om de beginnershandleiding sql en php door te nemen van phptuts.nl. Hier staat de basis in.
Als je die hebt doorgenomen en dan vragen stelt, weet je al iets meer over de basis van PHP en MySQL, je leert er veel van :)
dus volgende vraag:
klopt het hoe ik mijn if statement heb geplaats bij het controleren van username and password?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?
try{
$sql = "SELECT username, password FROM users WHERE username > :user AND password > :pass";
$stmt = $db->prepare($sql);
$stmt->bindParam(':user', $user, PDO::PARAM_INT);
$stmt->bindParam(':pass', $pass, PDO::PARAM_STR);
$pass = md5($_POST['username']);
$user = $_POST['password'];
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row['username'] === $user && $row['pass'] === $pass){
echo ('gelukt!'); }
else{
echo ('niet gelukt');}
}
catch (PDOException $e)
{
echo '<pre>';
echo 'Regel: '.$e->getLine().'<br>';
echo 'Bestand: '.$e->getFile().'<br>';
echo 'Foutmelding: '.$e->getMessage();
echo '</pre>';
}
?>
try{
$sql = "SELECT username, password FROM users WHERE username > :user AND password > :pass";
$stmt = $db->prepare($sql);
$stmt->bindParam(':user', $user, PDO::PARAM_INT);
$stmt->bindParam(':pass', $pass, PDO::PARAM_STR);
$pass = md5($_POST['username']);
$user = $_POST['password'];
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
if ($row['username'] === $user && $row['pass'] === $pass){
echo ('gelukt!'); }
else{
echo ('niet gelukt');}
}
catch (PDOException $e)
{
echo '<pre>';
echo 'Regel: '.$e->getLine().'<br>';
echo 'Bestand: '.$e->getFile().'<br>';
echo 'Foutmelding: '.$e->getMessage();
echo '</pre>';
}
?>
http://www.openwall.com/phpass/
Verder is die if een beetje overbodig, je haalt een username en wachtwoord op die je al hebt, je moet controleren of er een match is gevonden (aantal rijen is groter dan 0). Nu krijg je waarschijnlijk een foutmelding als je een ongeldig username+wachtwoord combinatie hebt. (dan bestaat $row['username'] namelijk niet)
En ik vraag me ook af of je een rij wilt ophalen waar de username groter is dan de ingevulde username (username > :user moet zijn username = :user)
Maar het is al een stap de goede richting in. (als je het ook daadwerkelijk goed begrijpt)
Ik sluit me verder wel aan bij Chris om eerst even goed de beginners handleiding door te nemen, dan voorkom je al veel fouten en wordt het allemaal een stuk makkelijker.
Het lijkt me sterk dat je username een int is (geheel getal), verder is het wel ok om md5() te gebruiken om te testen, maar gebruik dit alsjeblieft niet in een productie omgeving (als het online staat voor gebruik, want md5() is tegenwoordig vrij waardeloos om wachtwoorden mee te hashen) kijk tegen die tijd eens naar : Verder is die if een beetje overbodig, je haalt een username en wachtwoord op die je al hebt, je moet controleren of er een match is gevonden (aantal rijen is groter dan 0). Nu krijg je waarschijnlijk een foutmelding als je een ongeldig username+wachtwoord combinatie hebt. (dan bestaat $row['username'] namelijk niet)
En ik vraag me ook af of je een rij wilt ophalen waar de username groter is dan de ingevulde username (username > :user moet zijn username = :user)
Maar het is al een stap de goede richting in. (als je het ook daadwerkelijk goed begrijpt)
Ik sluit me verder wel aan bij Chris om eerst even goed de beginners handleiding door te nemen, dan voorkom je al veel fouten en wordt het allemaal een stuk makkelijker.
Gewijzigd op 10/01/2012 16:46:11 door Jelle -
Smur f op 10/01/2012 16:42:07:
... want md5() is tegenwoordig vrij waardeloos om wachtwoorden mee te hashen ...
Beetje kort door de bocht.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
$sql = "SELECT username, password FROM users WHERE username = :user AND password = :pass";
$stmt = $db->prepare($sql);
$stmt->bindParam(':user', $user, PDO::PARAM_STR);
$stmt->bindParam(':pass', $pass, PDO::PARAM_STR);
$pass = md5($_POST['username']);
$user = $_POST['password'];
$stmt->execute();
if($stmt->rowCount() == 1 ) {
echo ($stmt->rowCount()); }
else{
echo ($stmt->rowCount());}
?>
$sql = "SELECT username, password FROM users WHERE username = :user AND password = :pass";
$stmt = $db->prepare($sql);
$stmt->bindParam(':user', $user, PDO::PARAM_STR);
$stmt->bindParam(':pass', $pass, PDO::PARAM_STR);
$pass = md5($_POST['username']);
$user = $_POST['password'];
$stmt->execute();
if($stmt->rowCount() == 1 ) {
echo ($stmt->rowCount()); }
else{
echo ($stmt->rowCount());}
?>
maar hij blijft 0 terug geven klopt dit?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$stmt->bindParam(':user', $user, PDO::PARAM_STR);
$stmt->bindParam(':pass', $pass, PDO::PARAM_STR);
$pass = md5($_POST['username']);
$user = $_POST['password'];
?>
$stmt->bindParam(':user', $user, PDO::PARAM_STR);
$stmt->bindParam(':pass', $pass, PDO::PARAM_STR);
$pass = md5($_POST['username']);
$user = $_POST['password'];
?>
Je zet nu eerst $user en $pas in de PDO parameters, maar pas daarna geef je ze een waarde. Dat klopt niet.
En daarnaast ook nog user en password omgedraaid :-)
Gewijzigd op 11/01/2012 10:48:38 door Erwin H
- SanThe - op 10/01/2012 16:51:52:
Beetje kort door de bocht.
Smur f op 10/01/2012 16:42:07:
... want md5() is tegenwoordig vrij waardeloos om wachtwoorden mee te hashen ...
Beetje kort door de bocht.
Maakt dit het goed? :)
http://www.phphulp.nl/php/forum/topic/dynamische-salt/81951/
erwin h dat heb ik goed gezet maar het werkt nog steeds niet...
Hoe heb je het nu?