How to make a secure login system in PHP

Ensuring the security of your PHP login system is fundamental to protecting user data and the integrity of your site.

In this guide, we'll show you step by step how to implement a login system robust and secure, from the initial configuration of the development environment to the best security practices.

Creating a login system in php

Why is a Secure Login System Important?

The importance of security

When it comes to creating a PHP login system, security is not an option, but a necessity. A secure login system protects your users' sensitive information and prevents confidential data from being accessed by malicious people. Without the right security measures, your application can become an easy target for hackers.

Main threats to login systems

There are several threats that can compromise a login system, among them:

  • Brute force attacks: repeated attempts to guess passwords.
  • SQL injection: insertion of malicious code via input fields.
  • Session theft: capturing session cookies to impersonate another user.
  • Cross-Site Scripting (XSS): execution of malicious scripts in the user's browser.

Benefits of a secure system

Implementing a secure login system has many benefits:

  • Data protection: ensures that personal and sensitive information remains secure.
  • User confidence: users feel more secure when using your application.
  • Legal compliance: helps to comply with data protection regulations.
  • Risk reduction: minimizes the chance of successful attacks and their consequences.

A secure login system is the first line of defense against cyber threats. It not only protects user data, but also strengthens your application's reputation.

Configuring the Development Environment

setting up the environment

PHP and MySQL installation

To begin with, it is essential to have PHP and MySQL installed on your system. You can download PHP directly from the official website and MySQL from the official MySQL website. Make sure you download the correct version for your operating system.

Configuring the server

After installing PHP and MySQL, you'll need to set up a local server. The easiest way to do this is to use packages such as XAMPP or WAMP, which come with Apache, PHP and MySQL ready to use. Simply download, install and start the server.

Checking versions and dependencies

Before you start coding, it's important to check that all versions and dependencies are correct. You can do this by running the following commands in the terminal:

php -v
mysql --version

This ensures that you are using the latest and most compatible versions of PHP and MySQL. Also, check that you have the necessary PHP extensions installed, such as mysqli e pdo_mysql.

Creating the Database

Basic database structure

First, we need to create the database structure that will store the user information. Let's create a table called users with the following fields:

CREATE TABLE users (
  ID INT UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT,
  login VARCHAR(30) NOT NULL,
  password VARCHAR(40) NOT NULL,
  PRIMARY KEY (ID)
) ENGINE=MyISAM;

This table has three columns: ID, which is the primary key and will be incremented automatically; login, which will store the username; and password, which will store the user's password.

Creating the necessary tables

In addition to the table usersIn addition, we can create other tables for extra functionality, such as login attempts. For example, a table for storing login attempts could be created like this:

CREATE TABLE login_attempts (
  attempt_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  user_id INT NOT NULL,
  attempt_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

This table helps to monitor and limit login attempts, preventing brute force attacks.

Setting user permissions

To increase security, it is important to define specific permissions for database users. Create a user with limited privileges:

CREATE USER 'sec_user'@'localhost' IDENTIFIED BY 'passwordSegura123';
GRANT SELECT, INSERT, UPDATE ON `your_database`.* TO 'sec_user'@'localhost';

Tip: Use a strong and unique password for the database user. This helps protect your information from unauthorized access. With these permissions, even if someone manages to access the database, they won't be able to delete or modify critical data.

Implementing the Login Form

HTML structure of the form

Let's create the basic structure of the HTML login form. This form will collect the user's username and password. Here's a simple example:

<!DOCTYPE html>
<html>
<head>
    <title>User login</title>
</head>
<body>
    <form method="POST" action="/en/login.php/" data-trp-original-action="login.php">
        <label for="login">Login:</label>
        <input type="text" name="login" id="login" required><br>
        <label for="senha">Password:</label>
        <input type="password" name="senha" id="senha" required><br>
        <input type="submit" value="To enter">
    <input type="hidden" name="trp-form-language" value="en"/></form>
</body>
</html>

Adding JavaScript for password hashing

To increase security, it is good practice to hash the password on the client side before sending it to the server. This can be done with JavaScript. Let's use the SHA-512 library for this. First, add the library's script to your HTML:

<script type="text/javascript" src="sha512.js"></script>

Then create a JavaScript function to hash the password:

<script type="text/javascript">
function hashSenha(form, password) {
    var p = document.createElement("input");
    form.appendChild(p);
    p.name = "hashed_senha";
    p.type = "hidden";
    p.value = sha512(password.value);
    password.value = "";
    form.submit();
}
</script>

And modify the form to use this function:

<form method="POST" action="/en/login.php/" onsubmit="hashSenha(this, this.senha);" data-trp-original-action="login.php">
    <label for="login">Login:</label>
    <input type="text" name="login" id="login" required><br>
    <label for="senha">Password:</label>
    <input type="password" name="senha" id="senha" required><br>
    <input type="submit" value="To enter">
<input type="hidden" name="trp-form-language" value="en"/></form>

Form design best practices

A good form design is not only aesthetically pleasing, but also improves usability and security. Here are some tips:

  • Use clear and concise labels: Make sure that the form fields are clearly labeled.
  • Input validation: Validate user data on both the client and server side.
  • Immediate feedback: Inform users immediately if there is an error in filling out the form.
  • Accessibility: Ensure that the form is accessible to all users, including those who use screen readers.

Tip: Always use HTTPS to ensure that the data transmitted between the client and the server is secure.

Secure Login Processing

adding functionalities

Sanitizing user entries

Before anything else, it is essential to sanitize user entries. This means cleaning and validating the data that the user enters into the login form. Use functions such as htmlspecialchars() e mysqli_real_escape_string() to prevent SQL and XSS injections.

Checking credentials in the database

After sanitizing the data, the next step is to check the credentials in the database. Use statements prepared with mysqli to avoid SQL injections. Here's a basic example:

if ($stmt = $mysqli->prepare("SELECT id, username, password, salt FROM members WHERE email = ? LIMIT 1")) {
    $stmt->bind_param('s', $email);
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($user_id, $username, $db_password, $salt);
    $stmt->fetch();
    $password = hash('sha512', $password.$salt);
    if($stmt->num_rows == 1) {
        if($db_password == $password) {
            // Login successful
        } else {
            // Incorrect password
        }
    } else {
        // User not found
    }
}

Managing sessions securely

Managing sessions securely is crucial to protecting the user's account. Always regenerate the session ID after logging in with session_regenerate_id(). In addition, store important information such as the IP address and user agent to verify the authenticity of the session.

Remember: Never store passwords in plain text. Always use hashing and preferably a salt

to strengthen security.

Additional Practices to Strengthen Security

validating the system

Account blocking after several attempts

Implement a temporary blocking system after several failed login attempts. This can be done by counting login attempts over a period of time and, when a limit is exceeded, temporarily blocking the account.

Use of HTTPS and SSL

Always use HTTPS and SSL to protect communications between the client and the server. This helps prevent attacks such as man-in-the-middle, where transmitted data can be intercepted.

Multi-factor authentication

For an extra level of security, consider implementing multi-factor authentication (MFA). This can include something the user knows (password), something they have (SMS token) or something they are (fingerprint).

Conclusion

By following these steps, you'll be well on your way to creating a secure and robust PHP login system.

Security must always be a priority, as it protects not only user data, but also the reputation and integrity of your application.

Leave a comment

Your email address will not be published. Required fields are marked *