Scan in the browser

Paste phpinfo() output, a php.ini, .user.ini, PHP-FPM pool or .htaccess and get the same report as the command-line scanner.

Nothing leaves your browser. The scanner runs locally in WebAssembly (php-wasm) and sends nothing back.

Scan #

Options detected automatically

Getting the output safely #

Never leave phpinfo() publicly reachable. It prints environment variables, request headers and cookies, which often hold database passwords, API keys and session IDs (even HttpOnly ones), plus paths and versions that help an attacker.

The scanner needs only the version, SAPI, loaded ini files, directives and extensions. This script prints exactly that, in a format the scanner reads like phpinfo() output:

<?php
header('Content-Type: text/plain');
header('Cache-Control: no-store');
// Credentials only need to be known as set; URLs (session.save_path, DSNs) can embed them too.
$show = fn ($name, $value) => (string) $value === '' ? 'no value'
    : (preg_match('/(^|[._])(pw|pass|passwd|password|secret|token|auth|license|licence|api_?key)$/i', $name) ? '(set)'
    : preg_replace(['#(://)[^/@\s]*@#', '/([?&;]\s*(?:pw|pass|passwd|password|secret|token|auth|api_?key)\w*=)[^&;,\s]*/i'],
        ['$1(set)@', '$1(set)'], $value));
echo 'PHP Version => ', PHP_VERSION, "\nServer API => ", PHP_SAPI, "\nSystem => ", PHP_OS_FAMILY,
    "\nLoaded Configuration File => ", php_ini_loaded_file() ?: '(none)',
    "\nAdditional .ini files parsed => ", str_replace(",\n", ', ', trim((string) php_ini_scanned_files())) ?: '(none)', "\n\n";
foreach (ini_get_all(null, true) as $name => $value) {
    echo $name, ' => ', $show($name, $value['local_value']), ' => ', $show($name, $value['global_value']), "\n";
}
foreach (get_loaded_extensions() as $extension) {
    echo "\n", $extension, "\n";
}

Inputs #

One input is audited at a time. To combine php.ini, its scan directory, pools and overlays, use the command-line scan.