update set in mysql db werkt niet
ik ben bezig met een wachtwoord vergeten script. je ziet eerst een formulier waar je je username en e-mail adres invoert, dan krijg je op het aangegeven e-mail adres een e-mail met daarin een link. open je de link dan kun je je ww wijzigen, dit werkt.
Maar als je op de knop update password klikt dan zal het ww in de database moeten veranderen, dit werkt nog niet.
Als ik een var_dump uitvoer van de query dan krijg ik: string(48) "UPDATE users SET password='w' WHERE username='' " .
Hij laat de username leeg, hoe kan ik veranderen?
Ik voeg de code erbij want misschien staat er ergens anders een fout?
alvast bedankt.
Dit is het eerste bestand:
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<!DOCTYPE HTML>
<html lang="en">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
include ("connect.php");
if(isset($_GET['code']) ? $_GET['code'] : null)
{
//$get_username = $_GET['username'];
$get_username = isset($_GET['username']) && trim($_GET['username'])!='' ? $_GET['username'] : '';
//$get_username = (!empty($_GET['username']) ? $_GET['username'] : null);
//$get_code = $_GET['code'];
//$db_username = $_GET['username'];
$sq = "SELECT * FROM users WHERE username='$get_username' ";
//var_dump($get_username);
$result = mysqli_query($link, $sq) or die(mysqli_error());
while($row = mysqli_fetch_assoc($result))
{
$db_code = $row['passreset'];
$db_username = $row['username'];
//$get_username = $row ['username'];
}
$db_username = null;
$db_code = null;
$get_code = null;
if($get_username == $db_username && $get_code == $db_code)
{
echo "
<form action='pass_reset_complete.php?code=$get_code' method='POST'>
Enter a new password <br />
<input type='password' name='newpass'><br />
Re-enter your password <br />
<input type='password' name='newpass1'><br />
<input type='hidden' name='username' value='$db_username'>
<input type='submit' value='update password'>
</form>
";
}
}
//if(isset(!$_GET['code']) ? !$_GET['code'] : null)
//if(!empty(!$_GET['code']) ? !$_GET['code'] : null);
if(!$_GET['code'])
{
echo "<form action='forgot_pass.php' method='POST'>Enter your username <br /> <input type='text' name='username'> <br />
Enter your email <br /> <input type='text' name='email'><br />
<input type='submit' value='submit' name='submit'>
</form> ";
if(isset($_POST['submit']))
{
$username = $_POST['username'];
$email = $_POST ['email'];
$query = "SELECT * FROM users WHERE username='$username' ";
$result = mysqli_query($link, $query) or die(mysqli_error());
$numrow = mysqli_num_rows($result);
if($numrow !=0)
{
while ($row = mysqli_fetch_assoc($result))
{
$db_email = $row['email'];
}
if($email == $db_email)
{
$code = rand(10000, 1000000);
$to = $db_email;
$subject = "password reset";
$body = "Dit is een automatische E-mail, doe geen reply.
Klik op de link of plak dit in de browser
http://localhost/php/wachtwoord_vergeten/forgot_pass.php?code=$code$username=$username
";
$sql = "UPDATE users SET passreset='$code' WHERE username='$username' ";
$result = mysqli_query($link, $sql) or die(mysqli_error());
//mail($to, $subject, $body);
include 'mail.php';
echo "check your E-mail.";
}
else
{
echo "email is incorrect";
}
}
else
{
echo "That username doesn't exist";
}
}}
?>
</body>
</html>
<html lang="en">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
include ("connect.php");
if(isset($_GET['code']) ? $_GET['code'] : null)
{
//$get_username = $_GET['username'];
$get_username = isset($_GET['username']) && trim($_GET['username'])!='' ? $_GET['username'] : '';
//$get_username = (!empty($_GET['username']) ? $_GET['username'] : null);
//$get_code = $_GET['code'];
//$db_username = $_GET['username'];
$sq = "SELECT * FROM users WHERE username='$get_username' ";
//var_dump($get_username);
$result = mysqli_query($link, $sq) or die(mysqli_error());
while($row = mysqli_fetch_assoc($result))
{
$db_code = $row['passreset'];
$db_username = $row['username'];
//$get_username = $row ['username'];
}
$db_username = null;
$db_code = null;
$get_code = null;
if($get_username == $db_username && $get_code == $db_code)
{
echo "
<form action='pass_reset_complete.php?code=$get_code' method='POST'>
Enter a new password <br />
<input type='password' name='newpass'><br />
Re-enter your password <br />
<input type='password' name='newpass1'><br />
<input type='hidden' name='username' value='$db_username'>
<input type='submit' value='update password'>
</form>
";
}
}
//if(isset(!$_GET['code']) ? !$_GET['code'] : null)
//if(!empty(!$_GET['code']) ? !$_GET['code'] : null);
if(!$_GET['code'])
{
echo "<form action='forgot_pass.php' method='POST'>Enter your username <br /> <input type='text' name='username'> <br />
Enter your email <br /> <input type='text' name='email'><br />
<input type='submit' value='submit' name='submit'>
</form> ";
if(isset($_POST['submit']))
{
$username = $_POST['username'];
$email = $_POST ['email'];
$query = "SELECT * FROM users WHERE username='$username' ";
$result = mysqli_query($link, $query) or die(mysqli_error());
$numrow = mysqli_num_rows($result);
if($numrow !=0)
{
while ($row = mysqli_fetch_assoc($result))
{
$db_email = $row['email'];
}
if($email == $db_email)
{
$code = rand(10000, 1000000);
$to = $db_email;
$subject = "password reset";
$body = "Dit is een automatische E-mail, doe geen reply.
Klik op de link of plak dit in de browser
http://localhost/php/wachtwoord_vergeten/forgot_pass.php?code=$code$username=$username
";
$sql = "UPDATE users SET passreset='$code' WHERE username='$username' ";
$result = mysqli_query($link, $sql) or die(mysqli_error());
//mail($to, $subject, $body);
include 'mail.php';
echo "check your E-mail.";
}
else
{
echo "email is incorrect";
}
}
else
{
echo "That username doesn't exist";
}
}}
?>
</body>
</html>
Dit is het tweede bestand: waarbij je gaat updaten naar de db:
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
28
29
30
31
32
33
34
35
36
37
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
28
29
30
31
32
33
34
35
36
37
<?php
include ("connect.php");
if(!empty($_POST['username'])){
$post_username = $_POST['username'];
}
$newpass = $_POST['newpass'];
$newpass1 = $_POST['newpass1'];
$post_username = $_POST ['username'];
$code = $_GET['code'];
if($newpass == $newpass1)
{
//$enc_pass = md5($newpass);
$enc_pass = $newpass;
$query = "UPDATE users SET password='$enc_pass' WHERE username='$post_username' ";
//$query = "UPDATE users SET passreset='0' WHERE username='$post_username' ";
$sql = "UPDATE users SET passreset='0' WHERE username='$post_username' ";
$result = mysqli_query($link, $query) or die(mysqli_error());
$result = mysqli_query($link, $sql) or die(mysqli_error());
//if (mysqli_query($link, $query)) {
//echo "Record updated successfully";
//} else {
// echo "Error updating record: " . mysqli_error($link);
//}
echo "Your password has been updated <p><a href='#'>Click here to login</a></p>";
var_dump($query);
//var_dump($sql);
var_dump($post_username);
}
else
{
echo "password must match <a href='forgot_pass.php?code=$code&username=$post_username'></a>click here to go back";
}
?>
include ("connect.php");
if(!empty($_POST['username'])){
$post_username = $_POST['username'];
}
$newpass = $_POST['newpass'];
$newpass1 = $_POST['newpass1'];
$post_username = $_POST ['username'];
$code = $_GET['code'];
if($newpass == $newpass1)
{
//$enc_pass = md5($newpass);
$enc_pass = $newpass;
$query = "UPDATE users SET password='$enc_pass' WHERE username='$post_username' ";
//$query = "UPDATE users SET passreset='0' WHERE username='$post_username' ";
$sql = "UPDATE users SET passreset='0' WHERE username='$post_username' ";
$result = mysqli_query($link, $query) or die(mysqli_error());
$result = mysqli_query($link, $sql) or die(mysqli_error());
//if (mysqli_query($link, $query)) {
//echo "Record updated successfully";
//} else {
// echo "Error updating record: " . mysqli_error($link);
//}
echo "Your password has been updated <p><a href='#'>Click here to login</a></p>";
var_dump($query);
//var_dump($sql);
var_dump($post_username);
}
else
{
echo "password must match <a href='forgot_pass.php?code=$code&username=$post_username'></a>click here to go back";
}
?>
Code (php)
1
2
3
4
2
3
4
<?php
$query = "UPDATE users SET password='$enc_pass' WHERE username='$post_username' ";
$sql = "UPDATE users SET passreset='0' WHERE username='$post_username' ";
?>
$query = "UPDATE users SET password='$enc_pass' WHERE username='$post_username' ";
$sql = "UPDATE users SET passreset='0' WHERE username='$post_username' ";
?>
Dat kan natuurlijk ook in 1x:
Code (php)
1
2
3
2
3
<?php
$query = "UPDATE users SET password='$enc_pass', passreset='0' WHERE username='$post_username' ";
?>
$query = "UPDATE users SET password='$enc_pass', passreset='0' WHERE username='$post_username' ";
?>
Lost daarvan: kennelijk is $post_username dus leeg
volg terug op welke (2) plaats(en) deze een waarde krijgt en wat er in het betreffende POST element zat
een
zou daar helderheid kunnen brengen
Array
(
[newpass] => w
[newpass1] => w
[username] =>
)
hoe kan ik die username vullen?
Deze query is zo lek als een mandje en is vatbaar voor SQL injectie.
$username=$username? Zonder & of & tussen de query-parameters?
Verder is password een gereserveerd woord in MySQL.
Waarom lopen alle acties (het tonen van een formulier, het verwerken van een formulier, het tonen van foutmeldingen) door elkaar in bovenstaande scripts? Ik raad je dringend aan al deze acties te scheiden in verschillende code-eenheden. Een bijkomend voordeel daarvan is dat die ook stukken makkelijker *in afzondering* te debuggen zijn dan deze, excusez-le-mot, brei.
EDIT: een username doorgeven via de URL is uit oogpunt van veiligheid ook geen goed idee volgens mij want proxies kunnen dit soort dingen cachen. In dat opzicht is POST data "veiliger" geloof ik.
Gewijzigd op 25/05/2016 15:47:16 door Thomas van den Heuvel
weet iemand een duidelijke en goede tutorial hierover, hoe ik een wachtwoord vergeten script kan maken?
Je moet gewoon de juiste stappen weten, en deze vertalen naar PHP.
De eerste stap is dat iemand zijn mailadres en of username invult.
Aan de hand van deze ingevoerde gegevens wordt er een willekeurige code gemaakt, die bedoeld is voor een mail met een link naar de pagina om een nieuw wachtwoord in te voeren.
Op die pagina vraag je twee keer het wachtwoord (invoercontrole) en voila... overschrijf het wachtwoordveld met het nieuwe wachtwoord, en verwijder je de tijdelijke code.
Uiteraard gebruik je hierbij password_hash() voor een betrouwbare en veilig opslag. Ook is het voordeel van deze stappen dat je geen wachtwoord via mail hoeft te versturen, en de gebruiker mag zelf zijn wachtwoord bepalen. Het beste is om hier wat restricties aan te hangen om de makkelijke wachtwoorden zoals: 'kat', 'geheim', 'asdf' tegen te gaan. Minimaal 8 tekens en een speciaal teken vind ik voldoende.
Gewijzigd op 25/05/2016 16:01:48 door - Ariën -
a) user geeft aan dat hij zijn password kwijt is.
vraag hem daarom iets dat bekend is: emailadres of username
b) markeer dat deze user zijn pass opvraagt en stuur hem per mail een code die je ook in je db bewaarde.
c) gebruiker klikt op link:
jij markeert de code als gebruikt en geeft deze gebruiker de mogelijkheid om zijn pw. aan te passen.
Liefst doe je dat zonder expliciet de username door te geven. Misschien de code nog even meegeven (aannemende dat de code uniek is) of de combinatie van username + code
Wanneer je zo'n recept hebt, wordt de implementatie ook bijna triviaal, dit is (bijna) simpelweg aan de molen draaien.
En als je je weg nog moet vinden in dit alles: splits dit dan op in deelproblemen. Probeer dit soort dingen niet in één brok uit te werken maar verdeel dit in behapbare brokken. Dat bedoelde ik mede met het in stukken opdelen van de te bouwen functionaliteit: deze bestaan uit afzonderlijke stappen die ook in afzondering behandeld kunnen (en zouden moeten) worden. Zowel bij het bouwen als het debuggen.