Hi, Could htmlspecialchars() use ENT_QUOTES by default?
I recently worked on an example script, where I tried to keep it simple by using htmlspecialchars directly, e.g. echo "<img src='" . htmlspecialchars($url) . "'>"; I'd completely forgotten that single quotes are not escaped by default, creating a XSS vulnerability, e.g. $url = "/' onerror='alert(1)"; All the common frameworks I could find use ENT_QUOTES to do this safely (details below). Christoph (cmb69) suggests this was done for HTML4 compatibility, with older versions of PHP possibly having issues with numeric character references (a quick search suggests PHP 5.4?). PHP uses the numeric version ' with ENT_QUOTES, and it should continue to do so - because the named version, ' was added in HTML5, but can still cause problems with legacy parsers; for example Android 4, and the one still in use by Microsoft Outlook (&/>/< was in the original HTML spec, and " was added in HTML2). I'd also be tempted to suggest ENT_SUBSTITUTE should be included, as I prefer to keep as much of the valid data (rather than losing everything), but that's not as important as escaping the apostrophe by default. Craig WordPress uses ENT_QUOTES (ish). https://developer.wordpress.org/reference/functions/esc_html/ Laravel, with Blade, uses ENT_QUOTES: https://github.com/illuminate/support/blob/master/helpers.php#L118 Symfony or Slim, with Twig, uses ENT_QUOTES | ENT_SUBSTITUTE: https://github.com/twigphp/Twig/blob/3.x/src/Extension/EscaperExtension.php#L243 CodeIgniter uses ENT_QUOTES | ENT_SUBSTITUTE: https://github.com/codeigniter4/CodeIgniter4/blob/develop/system/ThirdParty/Escaper/Escaper.php#L120 CakePHP uses ENT_QUOTES | ENT_SUBSTITUTE: https://github.com/cakephp/cakephp/blob/master/src/Core/functions.php#L67 YII uses ENT_QUOTES | ENT_SUBSTITUTE: https://github.com/yiisoft/yii2/blob/master/framework/helpers/BaseHtml.php#L111 Phalcon uses ENT_QUOTES: https://github.com/phalcon/phalcon/blob/v5.0.x/src/Html/Escaper.php#L78 FuelPHP uses ENT_QUOTES: https://github.com/fuel/core/blob/1.9/develop/config/config.php#L459