Secure form processing in PHP protects web applications from invalid input, cross-site scripting (XSS), and other attacks by validating submitted data, escaping output, and handling user input safely.
Validates Form Data Before Processing
- Use trim() to remove leading and trailing whitespace from text inputs.
- Use filter_var() to validate data such as email addresses.
- Check required fields on the server instead of relying only on HTML required attributes.
- Use allowlists to restrict input to accepted values, such as predefined roles or gender options.
- Validate numeric values and enforce appropriate ranges before using them.
Escapes User Input Before Displaying It
The htmlspecialchars() function converts special HTML characters into their corresponding entities, helping prevent user-provided text from being interpreted as HTML or JavaScript.
<?php
$name = $_POST['name'] ?? '';
echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8');
?>
For example, if a user submits <script>alert('Hello')</script>, escaping prevents the browser from interpreting the submitted value as an executable script in an HTML text context.
Note: Output escaping should match the context in which data is used. htmlspecialchars() is suitable for HTML text and quoted HTML attribute values, but it is not a universal solution for JavaScript, CSS, or URL contexts.
Prepared Statements for Database Queries
Prepared statements help prevent SQL injection by separating SQL commands from user-supplied values.
<?php
$pdo = new PDO(
'mysql:host=localhost;dbname=mydb;charset=utf8mb4',
'username',
'password',
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
if ($name !== '' && filter_var($email, FILTER_VALIDATE_EMAIL)) {
$stmt = $pdo->prepare(
'INSERT INTO users (name, email) VALUES (:name, :email)'
);
$stmt->execute([
'name' => $name,
'email' => $email
]);
echo 'Data saved successfully.';
}
?>
- The prepare() method creates a parameterized SQL statement.
- The execute() method supplies the values separately from the SQL query.
- Prepared statements prevent user input from being treated as SQL syntax.
Protects Forms Against CSRF Attacks
Cross-Site Request Forgery (CSRF) occurs when an attacker tricks an authenticated user's browser into submitting an unwanted request. PHP applications can use session-based CSRF tokens to verify that a form submission originated from a page that has access to the token.
<?php
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
?>
<form method="post" action="">
<input
type="hidden"
name="csrf_token"
value="<?= htmlspecialchars($_SESSION['csrf_token'], ENT_QUOTES, 'UTF-8') ?>"
>
<label for="name">Name:</label>
<input type="text" id="name" name="name" required>
<button type="submit">Submit</button>
</form>
Validate the token when processing the form:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$submittedToken = $_POST['csrf_token'] ?? '';
$sessionToken = $_SESSION['csrf_token'] ?? '';
if (
!is_string($submittedToken) ||
!is_string($sessionToken) ||
$sessionToken === '' ||
!hash_equals($sessionToken, $submittedToken)
) {
http_response_code(403);
exit('Invalid form submission.');
}
// Continue processing the validated request.
}
?>
- random_bytes() generates cryptographically secure random bytes for the token.
- hash_equals() compares the submitted token with the session token safely.
- The server rejects submissions with missing or invalid tokens before processing them.
Handles Sensitive Data Securely
- Use HTTPS to protect form data while it travels between the browser and server.
- Never store passwords in plain text; use password_hash() to hash passwords and password_verify() to verify them.
- Avoid displaying database errors, stack traces, or sensitive server details to users.
- Store database credentials outside publicly accessible source files and use accounts with limited database permissions.
- Use secure session cookie settings, including Secure, HttpOnly, and an appropriate SameSite policy.
- Apply authorization checks on the server before allowing users to access or modify protected resources.
Note: Validation, output escaping, prepared statements, and CSRF protection address different security risks. A secure PHP form should apply the protections relevant to the data it accepts and the actions it performs.