БлогNot. PHP 5.5 и выше: почему "не работает" htmlspecialchars?

PHP 5.5 и выше: почему "не работает" htmlspecialchars?

Начиная с версии PHP 5.5, функция htmlspecialchars, вызванная с единственным аргументом, который только и указывали 99% программистов, может повести себя странно - скажем, удалить все символы кириллицы из переданной ей строки, особенно если строка состояла только из них.

Возникают трудноуловимые ошибки и массовый плач "не работает". В этом блоге к таким скриптам относятся, например, эти: 1, 2, 3.

Ситуация решается очень легко.

1. Скрипты размещены в нужной кодировке, например, Windows-1251, и это отражено в мета-теге заголовка HTML:

<!doctype html>
<html>
<head>
 <title>Firework</title>
 <meta charset="Windows-1251"/>
</head>
<body>
<?php
//...
?>
</body></html>

2. В папке скрипта создан файл .htaccess со строкой

AddDefaultCharset windows-1251 

(или utf-8, если в пункте 1 указана кодировка "Юникод").

3. Функция htmlspecialchars вызвана кодом вида

htmlspecialchars($value,ENT_COMPAT,'cp1251')

вместо

htmlspecialchars($value)

Второй аргумент можно выбрать по своему вкусу, я здесь указал обрабатывать двойные кавычки, но не одинарные (апострофы). Возможные значения второго аргумента и список обозначений кодировок (третий аргумент) также есть на странице описания функции.

Соответственно, модуль params.php, который у меня есть во многих скриптах, достаточно привести к виду

<?php
 if (isset($params) && !empty($params)) {
  foreach ($params as $num=>$var) {
   if (isset($_POST[$var])) 
    $$var = trimall(htmlspecialchars(magic($_POST[$var]),ENT_COMPAT,'cp1251'));
   else if (isset($_GET[$var])) 
    $$var = trimall(htmlspecialchars(magic($_GET[$var]),ENT_COMPAT,'cp1251'));
   else if (isset($_SESSION[$var])) {
    $$var = trimall(htmlspecialchars(magic($_SESSION[$var]),ENT_COMPAT,'cp1251'));
    unset ($_SESSION[$var]);
   }
   else $$var = '';
  }
 }
?>

P.S. Для обработки всех кавычек лучше указывать второй аргумент функции htmlspecialchars как ENT_QUOTES, а не ENT_COMPAT.

P.P.S. С некоторых пор (с PHP 5.6) лучше вообще отказаться от однобайтовых кодировок и переходить на utf-8.

20.01.2018, 12:11 [3371 просмотр]


теги: ошибка php

К этой статье пока нет комментариев, Ваш будет первым