Skip to content

PHP Filters

PHP filters are used to validate and sanitize data, especially data coming from external sources like user input, databases, or APIs.

  • Validating data: Determines if the data conforms to expected rules or formats (e.g., is it a valid email address? Is it an integer within a specific range?).
  • Sanitizing data: Modifies the data to remove potentially harmful characters or elements, or to ensure it fits a specific format (e.g., removing HTML tags, encoding special characters).

PHP’s filter extension provides a standardized way to perform data validation and sanitization, making the process easier, safer, and often faster than using manual checks or regular expressions alone.

You can list the available filters using the filter_list() function:

<?php
echo "<table>";
echo "<tr><th>Filter Name</th><th>Filter ID</th></tr>";
foreach (filter_list() as $filter) {
echo '<tr><td>' . htmlspecialchars($filter) . '</td><td>' . filter_id($filter) . '</td></tr>';
}
echo "</table>";
?>

Web applications constantly interact with external data. Never trust external data implicitly! Sources include:

  • User input from HTML forms ($_GET, $_POST)
  • Cookies ($_COOKIE)
  • Data from web services or APIs
  • Server environment variables ($_SERVER)
  • Database query results

Security Alert: Failing to validate and sanitize external data can lead to serious security vulnerabilities (like Cross-Site Scripting (XSS), SQL Injection, Remote Code Execution) and can break your application’s functionality. PHP filters provide a crucial layer of defense.

The filter_var() function is the core function for filtering a single variable using a specified filter.

Syntax:

filter_var(mixed $value, int $filter = FILTER_DEFAULT, array|int $options = 0): mixed

Parameters:

  • value: The variable (value) you want to filter.
  • filter: The ID of the filter to apply (e.g., FILTER_VALIDATE_EMAIL, FILTER_SANITIZE_NUMBER_INT). Defaults to FILTER_DEFAULT (which is equivalent to FILTER_UNSAFE_RAW).
  • options: An associative array of options or flags to use with the specified filter.

Return Value: Returns the filtered data on success, false if the filter fails validation, or null if the FILTER_NULL_ON_FAILURE flag is used and validation fails.

Sanitizing aims to make data safe, often for output or storage, by removing or encoding unwanted elements.

Example: Sanitize String for HTML Output (Prevent XSS)

Section titled “Example: Sanitize String for HTML Output (Prevent XSS)”

Use htmlspecialchars() to convert special characters to HTML entities. This is the standard way to prevent XSS when outputting user-provided text into HTML.

<?php
$userInput = '<script>alert("XSS");</script> harmless text';
// Sanitize for safe HTML output
$safeOutput = htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
echo $safeOutput;
// Output: &lt;script&gt;alert(&quot;XSS&quot;);&lt;/script&gt; harmless text
// The script tag is rendered harmlessly as text, not executed.
?>

Note: FILTER_SANITIZE_STRING and FILTER_SANITIZE_STRIPPED are deprecated as of PHP 8.0 and removed in PHP 8.1. Use functions like htmlspecialchars(), strip_tags() (with caution), or specific sanitizers like FILTER_SANITIZE_EMAIL as appropriate.

Removes characters illegal in email addresses.

<?php
$email = ' john.doe(comment)@example.com\n';
$sanitizedEmail = filter_var($email, FILTER_SANITIZE_EMAIL);
echo $sanitizedEmail; // Output: john.doe@example.com
?>

Validating checks if data meets specific criteria.

Checks if a variable contains a valid integer value.

<?php
$input = "100"; // A string containing digits
$zeroInput = "0";
$invalidInput = "hello";
// Recommended way: Use FILTER_NULL_ON_FAILURE
$validatedInt = filter_var($input, FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
if ($validatedInt !== null) {
echo "'{$input}' is a valid integer. Value: " . $validatedInt . "<br>";
} else {
echo "'{$input}' is not a valid integer.<br>";
}
$validatedZero = filter_var($zeroInput, FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
if ($validatedZero !== null) {
// Correctly handles 0 as a valid integer
echo "'{$zeroInput}' is a valid integer. Value: " . $validatedZero . "<br>";
} else {
echo "'{$zeroInput}' is not a valid integer.<br>";
}
$validatedInvalid = filter_var($invalidInput, FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE);
if ($validatedInvalid !== null) {
echo "'{$invalidInput}' is a valid integer. Value: " . $validatedInvalid . "<br>";
} else {
echo "'{$invalidInput}' is not a valid integer.<br>";
}
?>

Explanation: Using FILTER_NULL_ON_FAILURE makes the function return null on validation failure, which avoids the common pitfall where filter_var returns false for failure, which can be confused with a valid input value of 0 or false.

Checks if a variable contains a valid IPv4 or IPv6 address.

<?php
$ip = "127.0.0.1";
if (filter_var($ip, FILTER_VALIDATE_IP)) {
echo htmlspecialchars($ip) . " is a valid IP address.<br>";
} else {
echo htmlspecialchars($ip) . " is not a valid IP address.<br>";
}
$ipv6 = "::1"; // Example IPv6 loopback
if (filter_var($ipv6, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
echo htmlspecialchars($ipv6) . " is a valid IPv6 address.<br>";
} else {
echo htmlspecialchars($ipv6) . " is not a valid IPv6 address.<br>";
}
?>

Example: Sanitize and Validate an Email Address

Section titled “Example: Sanitize and Validate an Email Address”

A common pattern: first sanitize, then validate.

<?php
$email = ' john.doe(remove)@example .com ';
// 1. Sanitize: Remove illegal characters and whitespace
$sanitizedEmail = filter_var($email, FILTER_SANITIZE_EMAIL);
// 2. Validate: Check if the sanitized result is a valid email format
if (filter_var($sanitizedEmail, FILTER_VALIDATE_EMAIL)) {
echo "'" . htmlspecialchars($sanitizedEmail) . "' is a valid email address.";
} else {
echo "'" . htmlspecialchars($sanitizedEmail) . "' is not a valid email address (Original input: '" . htmlspecialchars($email) ."').";
}
?>

Similar pattern for URLs.

<?php
$url = ' https:// w ww. example.com/path?query=yes ';
// 1. Sanitize: Remove illegal URL characters
$sanitizedUrl = filter_var($url, FILTER_SANITIZE_URL);
// 2. Validate: Check if the sanitized result is a valid URL format
if (filter_var($sanitizedUrl, FILTER_VALIDATE_URL)) {
echo "'" . htmlspecialchars($sanitizedUrl) . "' is a valid URL.";
} else {
echo "'" . htmlspecialchars($sanitizedUrl) . "' is not a valid URL (Original input: '" . htmlspecialchars($url) ."').";
}
?>

For a complete reference of all filter types, flags, and advanced usage (like filtering arrays with filter_input_array or filter_var_array), consult the official PHP documentation: