login system used to demo security in php
-
-
Save htkcodes/3ecf02072dbd994b1cf36b5d6ce880df to your computer and use it in GitHub Desktop.
PHP MySQL Login System
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
define('DB_USERNAME', 'root'); | |
define('DB_PASSWORD', 'Hoang123'); | |
define('DB_NAME', 'session_example'); | |
define('DB_SERVER', 'localhost'); | |
/* Attempt to connect to MySQL database */ | |
/** @var mysqli $mysqli */ | |
$mysqli = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME); | |
// Check connection | |
if($mysqli->connect_errno){ | |
die("ERROR: Could not connect. (" .$mysqli->connect_errno. ") " . $mysqli->connect_error); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- create database | |
CREATE DATABASE session_example; | |
-- creating table | |
CREATE TABLE users ( | |
id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, | |
username VARCHAR(50) NOT NULL UNIQUE, | |
password VARCHAR(255) NOT NULL, | |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP | |
); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
require_once 'config.php'; | |
// Define variables and initialize with empty values | |
$username = $password = ""; | |
$username_err = $password_err = ""; | |
// Processing form data when form is submitted | |
if($_SERVER["REQUEST_METHOD"] == "POST"){ | |
// Check if username is empty | |
if(empty(trim($_POST["username"]))){ | |
$username_err = 'Please enter username.'; | |
} else{ | |
$username = trim($_POST["username"]); | |
} | |
// Check if password is empty | |
if(empty(trim($_POST['password']))){ | |
$password_err = 'Please enter your password.'; | |
} else{ | |
$password = trim($_POST['password']); | |
} | |
// Validate credentials | |
if(empty($username_err) && empty($password_err)){ | |
// Prepare a select statement | |
$sql = "SELECT username, password FROM users WHERE username = ?"; | |
if($stmt = $mysqli->prepare($sql)){ | |
// Bind variables to the prepared statement as parameters | |
$stmt->bind_param("s", $param_username); | |
// Set parameters | |
$param_username = $username; | |
// Attempt to execute the prepared statement | |
if($stmt->execute()){ | |
// Store result | |
$stmt->store_result(); | |
// Check if username exists, if yes then verify password | |
if($stmt->num_rows == 1){ | |
// Bind result variables | |
$stmt->bind_result($username, $hashed_password); | |
if($stmt->fetch()){ | |
if(password_verify($password, $hashed_password)){ | |
/* Password is correct, so start a new session and | |
save the username to the session */ | |
session_start(); | |
$_SESSION['username'] = $username; | |
header("location: welcome.php"); | |
} else{ | |
// Display an error message if password is not valid | |
$password_err = 'The password you entered was not valid.'; | |
} | |
} | |
} else{ | |
// Display an error message if username doesn't exist | |
$username_err = 'No account found with that username.'; | |
} | |
} else{ | |
echo "Oops! Something went wrong. Please try again later."; | |
} | |
} | |
// Close statement | |
$stmt->close(); | |
} | |
// Close connection | |
$mysqli->close(); | |
} | |
?> | |
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Login</title> | |
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"> | |
<style type="text/css"> | |
body{ font: 14px sans-serif; } | |
.wrapper{ width: 350px; padding: 20px; } | |
</style> | |
</head> | |
<body> | |
<div class="wrapper"> | |
<h2>Login</h2> | |
<p>Please fill in your credentials to login.</p> | |
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post"> | |
<div class="form-group <?php echo (!empty($username_err)) ? 'has-error' : ''; ?>"> | |
<label>Username:<sup>*</sup></label> | |
<input type="text" name="username"class="form-control" value="<?php echo $username; ?>"> | |
<span class="help-block"><?php echo $username_err; ?></span> | |
</div> | |
<div class="form-group <?php echo (!empty($password_err)) ? 'has-error' : ''; ?>"> | |
<label>Password:<sup>*</sup></label> | |
<input type="password" name="password" class="form-control"> | |
<span class="help-block"><?php echo $password_err; ?></span> | |
</div> | |
<div class="form-group"> | |
<input type="submit" class="btn btn-primary" value="Submit"> | |
</div> | |
<p>Don't have an account? <a href="register.php">Sign up now</a>.</p> | |
</form> | |
</div> | |
</body> | |
</html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
session_start(); | |
// Unset all of the session variables | |
$_SESSION = array(); | |
// Destroy the session. | |
session_destroy(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
require_once 'config.php'; | |
// Define variables and initialize with empty values | |
$username = $password = $confirm_password = ""; | |
$username_err = $password_err = $confirm_password_err = ""; | |
// Processing form data when form is submitted | |
if($_SERVER["REQUEST_METHOD"] == "POST"){ | |
// Validate username | |
if(empty(trim($_POST["username"]))){ | |
$username_err = "Please enter a username."; | |
} else{ | |
// Prepare a select statement | |
$sql = "SELECT id FROM users WHERE username = ?"; | |
if($stmt = $mysqli->prepare($sql)){ | |
// Bind variables to the prepared statement as parameters | |
$stmt->bind_param("s", $param_username); | |
// Set parameters | |
$param_username = trim($_POST["username"]); | |
// Attempt to execute the prepared statement | |
if($stmt->execute()){ | |
// store result | |
$stmt->store_result(); | |
if($stmt->num_rows == 1){ | |
$username_err = "This username is already taken."; | |
} else{ | |
$username = trim($_POST["username"]); | |
} | |
} else{ | |
echo "Oops! Something went wrong. Please try again later."; | |
} | |
} | |
// Close statement | |
$stmt->close(); | |
} | |
// Validate password | |
if(empty(trim($_POST['password']))){ | |
$password_err = "Please enter a password."; | |
} elseif(strlen(trim($_POST['password'])) < 6){ | |
$password_err = "Password must have atleast 6 characters."; | |
} else{ | |
$password = trim($_POST['password']); | |
} | |
// Validate confirm password | |
if(empty(trim($_POST["confirm_password"]))){ | |
$confirm_password_err = 'Please confirm password.'; | |
} else{ | |
$confirm_password = trim($_POST['confirm_password']); | |
if($password != $confirm_password){ | |
$confirm_password_err = 'Password did not match.'; | |
} | |
} | |
// Check input errors before inserting in database | |
if(empty($username_err) && empty($password_err) && empty($confirm_password_err)){ | |
// Prepare an insert statement | |
$sql = "INSERT INTO users (username, password) VALUES (?, ?)"; | |
if($stmt = $mysqli->prepare($sql)){ | |
// Bind variables to the prepared statement as parameters | |
$stmt->bind_param("ss", $param_username, $param_password); | |
// Set parameters | |
$param_username = $username; | |
$param_password = password_hash($password, PASSWORD_DEFAULT); // Creates a password hash | |
// Attempt to execute the prepared statement | |
if($stmt->execute()){ | |
// Redirect to login page | |
header("location: login.php"); | |
} else{ | |
echo "Something went wrong. Please try again later."; | |
} | |
} | |
// Close statement | |
$stmt->close(); | |
} | |
// Close connection | |
$mysqli->close(); | |
} | |
?> | |
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Sign Up</title> | |
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.css"> | |
<style type="text/css"> | |
body{ font: 14px sans-serif; } | |
.wrapper{ width: 350px; padding: 20px; } | |
</style> | |
</head> | |
<body> | |
<div class="wrapper"> | |
<h2>Sign Up</h2> | |
<p>Please fill this form to create an account.</p> | |
<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post"> | |
<div class="form-group <?php echo (!empty($username_err)) ? 'has-error' : ''; ?>"> | |
<label>Username:<sup>*</sup></label> | |
<input type="text" name="username"class="form-control" value="<?php echo $username; ?>"> | |
<span class="help-block"><?php echo $username_err; ?></span> | |
</div> | |
<div class="form-group <?php echo (!empty($password_err)) ? 'has-error' : ''; ?>"> | |
<label>Password:<sup>*</sup></label> | |
<input type="password" name="password" class="form-control" value="<?php echo $password; ?>"> | |
<span class="help-block"><?php echo $password_err; ?></span> | |
</div> | |
<div class="form-group <?php echo (!empty($confirm_password_err)) ? 'has-error' : ''; ?>"> | |
<label>Confirm Password:<sup>*</sup></label> | |
<input type="password" name="confirm_password" class="form-control" value="<?php echo $confirm_password; ?>"> | |
<span class="help-block"><?php echo $confirm_password_err; ?></span> | |
</div> | |
<div class="form-group"> | |
<input type="submit" class="btn btn-primary" value="Submit"> | |
<input type="reset" class="btn btn-default" value="Reset"> | |
</div> | |
<p>Already have an account? <a href="login.php">Login here</a>.</p> | |
</form> | |
</div> | |
</body> | |
</html> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
session_start(); | |
// If session variable is not set it will redirect to login page | |
if(!isset($_SESSION['username']) || empty($_SESSION['username'])){ | |
header("location: login.php"); | |
exit; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment