This is a password recovery program I made, and I just want it checked out.
These aren't all the files for the login and register system, only the password recovery part. The columns in the users table are id, username, password, salt, passres, and passexp. passres is the reset token, and passexp is the expiration time for the url. I know I am supposed to mail them the link and not just show it to them, but I don't have an email server, so that is what I am doing to test it.
resetpass.php:
<?php
require_once('conn.php');
if (isset($_POST['user']) && !empty($_POST['user'])) {
$us = $_POST['user'];
$query = $con->query("SELECT * FROM users WHERE username = '".$con->real_escape_string($us)."' LIMIT 1");
if ($query->num_rows === 1) {
$row = $query->fetch_assoc();
do {
$key = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`~!@#$%^&*()-_=+|[]{}:<>./?"), 0, 50);
} while($con->query("SELECT passres FROM users WHERE passres = '".$con->real_escape_string($key)."'")->num_rows > 0);
$hash = hash('sha256', $key);
$date = time() + 172800;
if ($con->query("UPDATE users SET passres = '".$con->real_escape_string($hash)."', passexp = '".$con->real_escape_string($date)."' WHERE id = ".$con->real_escape_string($row['id']))) {
echo '<a href="reset.php?key='.urlencode($key).'&user='.urlencode($row['username']).'">http://localhost/login/reset.php?key='.$key.'&user='.urlencode($row['username']).'</a>';
} else {
echo ('An error occured.');
}
} else {
header('Location:'); exit();
}
} else {
?>
<form action='' method='post'>
<input type="text" name="user" placeholder="Enter Username">
<input type="submit" value="Submit">
</form>
<?php
}
?>
reset.php:
<?php
require_once('conn.php');
if (isset($_GET['key'], $_GET['user']) && !empty($_GET['key']) && !empty($_GET['user'])) {
$key = $_GET['key'];
$us = $_GET['user'];
$query = $con->query("SELECT * FROM users WHERE username = '".$con->real_escape_string($us)."' LIMIT 1");
if ($query->num_rows === 1) {
$row = $query->fetch_assoc();
if (isset($row['passres'], $row['passexp'])) {
if (hash('sha256', $key) == $row['passres']) {
if ($row['passexp'] <= time()) {
echo 'This link has expired!';
$con->query("UPDATE users SET passres = NULL, passexp = NULL WHERE username = '".$con->real_escape_string($us)."'");
} else {
?>
<form action='reset.php' method='post'>
<input style="display: none;" type='text' name='key' value='<?php echo $key ?>'>
<input style="display: none;" type='text' name='user' value='<?php echo $us ?>'>
<input type='password' name='pass' placeholder='New Password'> <?php echo (isset($_GET['er'])) ? $_GET['er'] : ''; ?><br>
<input type='password' name='cpass' placeholder='Confirm Password'><br>
<input type='submit' value='Update Password'>
</form>
<?php
}
} else {
echo 'this page does not exist!';
}
} else {
echo 'this page does not exist!';
}
} else {
echo 'this page does not exist!';
}
} elseif (isset($_POST['key'], $_POST['user'], $_POST['pass'], $_POST['cpass']) && !empty($_POST['key']) && !empty($_POST['user']) && !empty($_POST['pass']) && !empty($_POST['cpass'])) {
$key = $_POST['key'];
$us = $_POST['user'];
$pass = $_POST['pass'];
$cpass = $_POST['cpass'];
if ($pass !== $cpass) {header('Location: reset.php?key='.urlencode($key).'&user='.urlencode($us).'&er=The+passwords+don\'t+match!'); exit();}
if (strlen($pass) < 8) {header('Location: reset.php?key='.urlencode($key).'&user='.urlencode($us).'&er=The+password+needs+to+be+at+least+8+characters'); exit();}
$query = $con->query("SELECT * FROM users WHERE username = '".$con->real_escape_string($us)."' LIMIT 1");
if ($query->num_rows === 1) {
$row = $query->fetch_assoc();
if (isset($row['passres'], $row['passexp'])) {
if (hash('sha256', $key) == $row['passres']) {
if ($row['passexp'] <= time()) {
echo 'This link has expired!';
$con->query("UPDATE users SET passres = NULL, passexp = NULL WHERE username = '".$con->real_escape_string($us)."'");
} else {
$pass = sha1(md5($pass).sha1($row['salt']));
if ($con->query("UPDATE users SET password = '".$con->real_escape_string($pass)."', passres = NULL, passexp = NULL WHERE username = '".$con->real_escape_string($us)."'")) {
echo 'Password Reset! click <a href="index.php">here</a> to sign in';
}
}
} else {
echo 'this page does not exist!';
}
} else {
echo 'this page does not exist!';
}
} else {
echo 'this page does not exist!';
}
} else {
header('Location: resetpass.php'); exit();
}
?>
conn.php:
<?php
session_start();
$con = new mysqli('localhost', 'root', '**********', 'test');
?>