Что такое код htmlspecialchars


htmlspecialchars()

Синтаксис:

htmlspecialchars(string[, flags[, charset[, double_encode]]])

Поддерживается следующими версиями PHP:

Описание функции:

Функция htmlentities() преобразует символы &,»»,», в HTML сущности. Возвращает преобразованную строку.

Обязательный аргумент. Строка которая будет отконвертировона

Необязательный аргумент. Флаг определяет как будут обрабатываться двойные и одинарные кавычки.

ENT_COMPAT — конвертируются двойные кавычки, а одинарные остаются без изменений (используется по умолчанию);

ENT_QUOTES — конвертируются двойные и одинарные кавычки;

ENT_NOQUOTES — любые кавычки не конвертируются;

ENT_IGNORE — если есть неверный код, то он отбрасавется. Без этого флага возвращается пустая строка (добавлено в версии 5.3). Этот флаг добавлен для обратной совместимости. Избегайте его использование, так как это может повлиять на безопасность.

Необязательный аргумент. Определяет кодировку, используемую при преобразовании. Поддерживаются следующие кодировки:

ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252, KOI8-R, BIG5, GB2312, BIG5-HKSCS, Shift_JIS, EUC-JP

Если ни одна из выше перечисленных кодировок не поддерживаются, то по умолчанию применяется ISO-8859-1

string double_encode Необязательный аргумент. Если double_encode отключен, то преобразования html-етгов не происходит. По умолчанию преобразуется всё. bool

Производятся следующие преобразования:

Примеры:

Пример 1:

$a = «Руководство по PHP»;
echo «Строка без обработки : «.$a;
echo «
«;
htmlspecialchars(«Руководство по PHP», ENT_QUOTES);
echo «Строка с обработкой: «.htmlspecialchars($a);
?>

Строка без обработки : Руководство по PHP
Строка с обработкой: Руководство по PHP

Код HTML страницы будет выглядеть следующим образом:

Строка без обработки : Руководство по PHP
Строка с обработкой: Руководство по PHP

htmlspecialchars

htmlspecialchars — конвертирует специальные символы в мнемоники HTML.

Описание

string htmlspecialchars (string string [, int quote_style [, string charset]])

Некоторые символы имеют в HTML специальное значение и должны быть представлены мнемониками HTML для сохранения своего значения. Эта функция возвращает строку с выполненной конвертацией; трансляция выполняется как всегда в современном web-программировании. Если вам нужны все оттранслированные HTML-мнемоники символов, используйте htmlentities().

Эта функция используется для предотвращения ввода вместе с пользовательским текстом разметки HTML, как в досках объявлений или в приложении guest book. Необязательный второй аргумент, quote_style, сообщает функции, что делать с символами одинарных и двойных кавычек. Режим по умолчанию, ENT_COMPAT, обратно совместим только для трансляции двойных кавычек и оставляет одинарные кавычки неоттранслированными. Если установлен ENT_QUOTES, и двойные, и одинарные кавычки транслируются, а если установлен ENT_NOQUOTES — ни одинарные. ни двойные кавычки не транслируются.

‘»‘ (double quote) становится ‘»‘ когда ENT_NOQUOTES не установлен

»’ (single quote) становится »’, только когда установлен ENT_QUOTES.

‘ ‘ (greater than) становится ‘>’

Пример 1. htmlspecialchars()

Обратите внимание, что эта функция не транслирует ничего, кроме перечисленного выше. О полной трансляции мнемоник см. htmlentities(). Поддержка второго необязательного аргумента была введена в PHP 3.0.17 и PHP 4.0.3.

Третий аргумент определяет набор символов, используемый при конвертации. По умолчанию это ISO-8859-1. Поддержка третьего аргумента была введена в PHP 4.1.0.

htmlspecialchars

htmlspecialchars — Преобразует специальные символы в HTML-сущности

Описание

В HTML некоторые символы имеют специальное значение и для сохранения своего значения должны быть преобразованы в HTML-сущности. Эта функция возвращает строку, над которой проведены эти преобразования. Если вам нужно преобразовать все возможные сущности, используйте htmlentities() .

Вызова функции htmlspecialchars() достаточно, если кодировка поддерживает все символы во входной строке (такая как UTF-8, но также ISO-8859-1 при входной только ISO-8859-1). Необходимость в вызове функции htmlentities() появляется только тогда, когда выходная кодировка не поддерживает все символы из входной строки.

Эта функция полезна при отображении данных, введенных пользователем, которые могут содержать нежелательные HTML тэги, например в форуме или гостевой книге.

Производятся следующие преобразования:

  • ‘&’ (амперсанд) преобразуется в ‘&’
  • ‘»‘ (двойная кавычка) преобразуется в ‘»‘ в режиме ENT_NOQUOTES is not set.
  • «‘» (одиночная кавычка) преобразуется в »’ только в режиме ENT_QUOTES .
  • ‘>’ (знак «больше чем») преобразуется в ‘>’

Список параметров

Битовая маска из нижеуказанных флагов, определяющих режим обработки кавычек, некорректных кодовых последовательностей и используемый тип документа. По умолчанию используется ENT_COMPAT | ENT_HTML401.

Доступные значения параметра flags
Название константы Описание
ENT_COMPAT Преобразует двойные кавычки, одинарные кавычки не изменяются.
ENT_QUOTES Преобразует как двойные, так и одинарные кавычки.
ENT_NOQUOTES Оставляет без изменения как двойные, так и одинарные кавычки.
ENT_IGNORE Без всяких уведомительных сообщений отбрасывает некорректные кодовые последовательности вместо возврата пустой строки. Использование этого флага не рекомендуется, так как это может привести к » негативным последствиям, связанным с безопасностью.
ENT_SUBSTITUTE Заменяет некорреткные кодовые последовательности символом замены Юникода U+FFFD в случае использования UTF-8 и &#FFFD; при использовании другой кодировки, вместо возврата пустой строки.
ENT_DISALLOWED Заменяет неверные коды символов для заданного типа документа символом замены юникода U+FFFD (UTF-8) или &#FFFD; (при использовании другой кодировки) вместо того, чтобы оставлять все как есть. Это может быть полезно, например, для того, чтобы убедиться в формальной правильности XML-документов со встроенным внешним контентом.
ENT_HTML401 Обработка кода в соответствии с HTML 4.01.
ENT_XML1 Обработка кода в соответствии с XML 1.
ENT_XHTML Обработка кода в соответствии с XHTML.
ENT_HTML5 Обработка кода в соответствии с HTML 5.

Определяет кодировку, используемую для преобразования. Если не указано, то кодировкой по умолчанию является ISO-8859-1 для PHP до версии 5.4.0, и UTF-8 начиная с версии 5.4.0.

Для целей этой функции кодировки ISO-8859-1, ISO-8859-15, UTF-8, cp866, cp1251, cp1252 и KOI8-R являются практически эквивалентными, предполагая то, что сама строка string содержит корректные символы в указанной кодировке, то символы, изменяемые htmlspecialchars() , останутся на тех же местах во всех этих кодировках.

Поддерживаются следующие кодировки:

Поддерживаемые кодировки
Кодировка Псевдонимы Описание
ISO-8859-1 ISO8859-1 Западно-европейская Latin-1.
ISO-8859-5 ISO8859-5 Редкоиспользуемая кириллическая кодировка (Latin/Cyrillic).
ISO-8859-15 ISO8859-15 Западно-европейская Latin-9. Добавляет знак евро, французские и финские буквы к кодировке Latin-1(ISO-8859-1).
UTF-8 8-битная Unicode, совместимая с ASCII.
cp866 ibm866, 866 Кириллическая кодировка, применяемая в DOS.
cp1251 Windows-1251, win-1251, 1251 Кириллическая кодировка, применяемая в Windows.
cp1252 Windows-1252, 1252 Западно-европейская кодировка, применяемая в Windows.
KOI8-R koi8-ru, koi8r Русская кодировка.
BIG5 950 Традиционный китайский, применяется в основном на Тайване.
GB2312 936 Упрощенный китайский, стандартная национальная кодировка.
BIG5-HKSCS Расширенная Big5, применяемая в Гонг-Конге.
Shift_JIS SJIS, SJIS-win, cp932, 932 Японская кодировка.
EUC-JP EUCJP, eucJP-win Японская кодировка.
MacRoman Кодировка, используемая в Mac OS.
» Пустая строка активирует режим определения кодировки из файла скрипта (Zend multibyte), default_charset и текущей локали (см. nl_langinfo() и setlocale() ), в указанном порядке. Не рекомендуется к использованию.

Замечание: Остальные кодировки не поддерживаются, вместо них будет применена кодировка по умолчанию и сгенерировано предупреждение.

Если параметр double_encode выключен, то PHP не будет преобразовывать существующие html-сущности. По умолчанию преобразуется все без ограничений.

Возвращаемые значения

Если входная строка string содержит неверную последовательность символов в указанной кодировке encoding , то будет возвращаться пустая строка в случае, если флаги ENT_IGNORE или ENT_SUBSTITUTE не установлены.

Список изменений

Версия Описание
5.4.0 Значение по умолчанию для параметра encoding было изменено на UTF-8.
5.4.0 Добавлены константы ENT_SUBSTITUTE , ENT_DISALLOWED , ENT_HTML401 , ENT_XML1 , ENT_XHTML и ENT_HTML5 .
5.3.0 Добавлена константа ENT_IGNORE .
5.2.3 Добавлен параметр double_encode .
4.1.0 Добавлен параметр charset .

Примеры

Пример #1 Пример использования htmlspecialchars()

Примечания

Обратите внимание, что функция не производит других преобразований кроме описанных выше. Для преобразования всех HTML сущностей используйте htmlentities() .

Смотрите также

  • get_html_translation_table() — Возвращает таблицу преобразований, используемую функциями htmlspecialchars и htmlentities
  • htmlspecialchars_decode() — Преобразует специальные HTML-сущности обратно в соответствующие символы
  • strip_tags() — Удаляет HTML и PHP-теги из строки
  • htmlentities() — Преобразует все возможные символы в соответствующие HTML-сущности
  • nl2br() — Вставляет HTML-код разрыва строки перед каждым переводом строки

htmlspecialcharsbx

Давайте поговорим о данной функции, а так же о причине её появления в системе битрикс. В PHP существует встроенная функция htmlspecialchars которая предназначена для преобразования спец символов в так называемые html-сущности. Дело в том, что с выходом PHP версии 5.4 кое-что в данной функции изменилось, а именно — значение третьего параметра по умолчанию. Основная задача этого параметра это указание кодировки передаваемой функции строки. Теперь значением третьего параметра по умолчанию стала кодировка UTF-8.

Ничего плохого про кодировку UTF-8 не скажу, так же как и про функцию htmlspecialchars, т.к. если поменяли кодировку по умолчанию, значит так было нужно. Однако для системы битрикс это не пошло на руку по той причине, что если передавать строку с нелатинскими символами в иной кодировке, не передавая параметр кодировки, то функция возвращала пустую строку. Как вы можете представить, проблема ощутимая, т.к. в системе данная функция используется довольно часто.

Решение данной проблемы разработчики увидели в добавлении новой функции под названием htmlspecialcharsbx в главный модуль начиная с версии 11.5.9, таким образом, уже с 12-й версии битрикса заменен вызов стандартной функции htmlspecialchars.

По сути, функция, выполняющая роль альтернативной замены в битриксе работает на основе старой функции:

Таким образом, если константа BX_UTF была определена перед обращением к функции, то будет использоваться кодировка UTF-8 в ином случае ISO-8859-1.

htmlentities () против htmlspecialchars ()

Каковы различия между htmlspecialchars() и htmlentities() . Когда следует использовать один или другой?

Из документации PHP для htmlentities :

Эта функция идентична htmlspecialchars() всеми способами, за исключением htmlentities() , все символы, имеющие эквиваленты сущности HTML, переводятся в эти сущности.

Из документации PHP для htmlspecialchars :

Некоторые символы имеют особое значение в HTML и должны быть представлены объектами HTML, если они должны сохранять их значения. Эта функция возвращает строку с некоторыми из сделанных преобразований; сделанные переводы являются наиболее полезными для повседневного веб-программирования. Если вам требуется перевести все символы HTML-символов, вместо этого используйте htmlentities() .

Разница в том, что кодируется. Выбор – это все (сущности) или все минус «специальные» символы, такие как амперсанды, двойные и одинарные кавычки, меньше и больше (специальные).

Я предпочитаю использовать htmlspecialchars когда это возможно.

Можно использовать htmlspecialchars :

Когда нет необходимости кодировать все символы, имеющие свои эквиваленты HTML.

Если вы знаете, что кодировка страницы соответствует текстовым специальным символам, почему вы используете htmlentities ? htmlspecialchars очень проста, и htmlspecialchars меньше кода для отправки клиенту.

Второй – короче и не вызывает проблем, если установлена ​​кодировка ISO-8859-1.

Когда данные будут обрабатываться не только через браузер (чтобы избежать декодирования HTML-объектов),

Если выход – XML ​​(см. Ответ Artefacto ).

  • Иногда вы пишете XML-данные, и вы не можете использовать HTML-объекты в XML-файле.
  • Поскольку htmlentities заменяет больше символов, чем htmlspecialchars . Это необязательно, делает скрипт PHP менее эффективным и полученный HTML-код менее читабельным.

htmlentities необходимо, только если ваши страницы используют кодировки, такие как ASCII или LATIN-1 вместо UTF-8, и вы обрабатываете данные с кодировкой, отличной от страницы.

Это кодируется с помощью htmlentities .

implode( array_values( get_html_translation_table( HTML_ENTITIES ) ), «\t» ) :

«& <>
¡¢ £ ¤ ¥ | § ¨ © ª «¬ ® ¯ ° ± ² ³ ‘μ ¶ · ¸ ¹ º» ¼ ½ ¾ ¿À Á Â Ã Ä Å Ç È É Ê Ë Ì Í Ï Ï Ñ Ò Ò Ó Ô Õ Ö × Ø Ú Ú Û Ý Ý ß ß á â â ä å æ ç è è ò ò í í ð ð ð ò ò õ õ ÷ ø Œ ú ú ü ü Ÿ ÿ Œ Œ Œ ƒ ƒ ƒ ƒ ƒ

Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ ω θ Υ π – – », «» «† ‡ • … ‰ ‘» <>

Это кодируется с помощью htmlspecialchars .

implode( array_values( get_html_translation_table( HTML_SPECIALCHARS ) ), «\t» ) :

Вы должны использовать htmlspecialchars($strText, ENT_QUOTES) когда вы просто хотите, чтобы ваша строка была безопасна для XML и HTML:

Однако, если у вас также есть дополнительные символы, которые являются Unicode или необычными символами в вашем тексте, вы должны использовать htmlentities (), чтобы убедиться, что они правильно отображаются на вашей HTML-странице.

  • ‘будет только кодироваться htmlspecialchars () до & # 039; если включена опция ENT_QUOTES. & # 039; более безопасно использовать, поскольку более старые версии Internet Explorer не поддерживают » организация.
  • Технически> не нужно кодировать в соответствии со спецификацией XML, но обычно кодируется для соответствия требованиям get_html_translation_table . Вы передаете ему HTML_ENTITIES или HTML_SPECIALCHARS и он возвращает массив с символами, которые будут закодированы и как они будут закодированы.

htmlspecialchars () делает минимальный размер кодировки, чтобы убедиться, что ваша строка не анализируется как HTML. Это делает вашу строку более понятной для человека, чем если бы вы использовали htmlentities () для кодирования абсолютно всего, что имеет кодировку.

Вероятно, вы хотите использовать кодировку символов Unicode, например UTF-8 и htmlspecialchars. Потому что нет необходимости генерировать «HTML-сущности» для «всех [применимых символов» (то есть, что делает htmlentities в соответствии с документацией), если оно уже находится в вашем наборе символов.

htmlentities – преобразовать все применимые символы в объекты HTML.

htmlspecialchars – Преобразование специальных символов в объекты HTML.

Перевод выполнен с использованием символов перевода:

  • ‘&’ (амперсанд) становится ‘& amp;’
  • » ‘(двойная кавычка) становится «& quot;» когда ENT_NOQUOTES не установлен.
  • «’» (одинарная кавычка) становится «& # 039;» (или ‘) только при установке ENT_QUOTES.
  • ‘ ‘ (больше) становится ‘& gt;’

Вы можете проверить следующий код для получения дополнительной информации о том, что такое htmlentities и htmlspecialchars:

Один небольшой пример: мне нужно было иметь 2 имени клиента, индексированные в функции:

Я первоначально $term = get_term_by(‘name’, htmlentities($name), ‘client’); что привело к именам терминов, которые включали только элемент массива амперсанда (&), но не акцентированный элемент. Но когда я изменил настройку переменной на htmlspecialchars они смогли запустить функцию. Надеюсь это поможет!

Функция Htmlspecialchars

Функция Htmlspecialchars преобразует специальные символы в HTML-сущности.
Для сохранения значений HTML сущностей необходимо преобразовать некоторые символы, которые имеют особый смысл. Для этого используйте функцию Htmlspecialchars, которая производит преобразования сисвола & в &, двойных кавычкек в «, одинарных кавычек в или , символ в >.

Параметр String должен содержать конвертируемую строку (string).


Параметр Flags являет собой битовую маску флагов, определяющих режим обработки кавычек, некорректных кодовых последовательностей и используемый тип документа. По умолчанию используется ENT_COMPAT | ENT_HTML401.

Доступные значения параметра Flags:

ENT_COMPAT — Преобразует двойные кавычки, одинарные кавычки не изменяются.

ENT_QUOTES — Преобразует как двойные, так и одинарные кавычки.

ENT_NOQUOTES — Оставляет без изменения как двойные, так и одинарные кавычки.

ENT_IGNORE — Без всяких уведомительных сообщений отбрасывает некорректные кодовые последовательности вместо возврата пустой строки.

ENT_SUBSTITUTE — Заменяет некорректные кодовые последовательности символом замены Юникода U+FFFD в случае использования UTF-8 или &#xFFFD; при использовании другой кодировки, вместо возврата пустой строки.

ENT_DISALLOWED — Заменяет неверные коды символов для заданного типа документа символом замены юникода U+FFFD (UTF-8) или &#xFFFD; (при использовании другой кодировки) вместо того, чтобы оставлять все как есть.

ENT_HTML401 — Обработка кода в соответствии с HTML 4.01.

ENT_XML1 — Обработка кода в соответствии с XML 1.

ENT_XHTML — Обработка кода в соответствии с XHTML.

ENT_HTML5 — Обработка кода в соответствии с HTML 5.

Необязательный Encoding определяет кодировку, используемую при конвертации символов.

Значением по умолчанию для Encoding зависит от используемой версии PHP. Более ранние версии PHP используют ISO-8859-1. В PHP 5.4 и 5.5 используется UTF-8 по умолчанию. В PHP 5.6 и старше, для значения по умолчанию используется конфигурационная опция Default_charset.

Замечание: Остальные кодировки не поддерживаются, вместо них будет применена кодировка по умолчанию и сгенерировано предупреждение.

Если параметр Double_encode выключен, то PHP не будет преобразовывать существующие html-сущности. По умолчанию преобразуется все без ограничений.

Функция Htmlspecialchars возвращает преобразованную строку (string).

Если входная строка String содержит неверную последовательность символов в указанной кодировке Encoding, то будет возвращаться пустая строка в случае, если флаги ENT_IGNORE или ENT_SUBSTITUTE не установлены.

htmlspecialcharsEx

Переводит текст в HTML-безопасный вид, заменяя специальные символы их визуальным HTML представлением:

Исходные символы После замены
>
« «
« "
& &
>

Примечание: в отличии от стандартной PHP функции htmlspecialchars, данная функция позволяет задавать в тексте символы в виде: &код_символа;

Параметры функции

Параметр Описание
text Текст для преобразования.

См. также

Примеры использования

Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.

htmlspecialchars

htmlspecialchars — конвертирует специальные символы в мнемоники HTML.

Описание

string htmlspecialchars (string string [, int quote_style [, string charset]])

Некоторые символы имеют в HTML специальное значение и должны быть представлены мнемониками HTML для сохранения своего значения. Эта функция возвращает строку с выполненной конвертацией; трансляция выполняется как всегда в современном web-программировании. Если вам нужны все оттранслированные HTML-мнемоники символов, используйте htmlentities().

Эта функция используется для предотвращения ввода вместе с пользовательским текстом разметки HTML, как в досках объявлений или в приложении guest book. Необязательный второй аргумент, quote_style, сообщает функции, что делать с символами одинарных и двойных кавычек. Режим по умолчанию, ENT_COMPAT, обратно совместим только для трансляции двойных кавычек и оставляет одинарные кавычки неоттранслированными. Если установлен ENT_QUOTES, и двойные, и одинарные кавычки транслируются, а если установлен ENT_NOQUOTES — ни одинарные. ни двойные кавычки не транслируются.

‘»‘ (double quote) становится ‘»‘ когда ENT_NOQUOTES не установлен

»’ (single quote) становится »’, только когда установлен ENT_QUOTES.

‘ ‘ (greater than) становится ‘>’

Пример 1. htmlspecialchars()

Обратите внимание, что эта функция не транслирует ничего, кроме перечисленного выше. О полной трансляции мнемоник см. htmlentities(). Поддержка второго необязательного аргумента была введена в PHP 3.0.17 и PHP 4.0.3.

Третий аргумент определяет набор символов, используемый при конвертации. По умолчанию это ISO-8859-1. Поддержка третьего аргумента была введена в PHP 4.1.0.

Как отобразить htmlspecialchars на html?

Я читал здесь:
qaru.site/questions/1876165/.
что htmlspecialchars() очень эффективен, предотвращая атаки xss.

Я получаю сформированный текст из редактора wysiwyg, например:

Кодирование этого на моем html:

Будет выводиться в браузере:

Как я могу правильно отобразить форматированный текст, не допуская при этом инъекций XSS?

htmlspecialchars кодирует все символы, которые имеют (или могут) специальные значения в XML, в частности , > , & » , и ‘ (если установлен ENT_QUOTES).

Таким образом, с помощью этого параметра браузер не сможет отобразить любые попытки вредоносного кода.

который JS не будет обрабатывать. Таким образом, это может быть аффективным средством остановки инъекций XSS. Однако вы хотите, чтобы пользователи отправляли HTML-код, поэтому вам нужно будет сделать белый список утвержденных элементов. Это можно сделать, заменив <> на пользовательский текст, который не будет отображаться на входах пользователей. В моем примере ниже я выбрал custom_random_hack . Затем запустите все через htmlspecialchars который будет кодировать все специальные символы. Затем конвертируйте свои измененные элементы обратно в свои HTML-элементы.

Защищают ли мой PHP-код от внедрения htmlspecialchars и mysql_real_escape_string?

Ранее сегодня был задан вопрос относительно стратегии проверки ввода в веб-приложениях.

Верхний ответ на момент написания предлагает в PHP просто используя htmlspecialchars а также mysql_real_escape_string .

Мой вопрос: всегда ли этого достаточно? Есть еще что-то, что мы должны знать? Где эти функции ломаются?

6 ответов

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Когда дело доходит до запросов к базе данных, всегда пытайтесь использовать подготовленные параметризованные запросы. mysqli а также PDO библиотеки поддерживают это. Это бесконечно безопаснее, чем использование экранирующих функций, таких как mysql_real_escape_string .

Да, mysql_real_escape_string фактически просто функция экранирования строки. Это не волшебная пуля. Все, что он будет делать, это экранировать опасные символы, чтобы их можно было безопасно использовать в одной строке запроса. Однако, если вы не очистите свои входные данные заранее, вы будете уязвимы для определенных векторов атаки.

Представьте себе следующий SQL:

Вы должны увидеть, что это уязвимо для использования.
Представь id параметр содержит общий вектор атаки:

Там нет рискованных символов для кодирования, поэтому он будет проходить прямо через экранирующий фильтр. Оставив нас:

Это прекрасный вектор SQL-инъекции, который позволит злоумышленнику вернуть все строки. Или же

Что позволяет злоумышленнику вернуть данные первого администратора в этом вымышленном примере.

Хотя эти функции полезны, они должны использоваться с осторожностью. Вы должны убедиться, что все веб-входы в некоторой степени проверены. В этом случае мы видим, что мы можем быть использованы, потому что мы не проверяли, что переменная, которую мы использовали в качестве числа, была на самом деле числовой. В PHP вы должны широко использовать набор функций для проверки того, что входные данные являются целыми числами, числами с плавающей запятой, буквенно-цифровыми значениями и т.д. Но когда дело доходит до SQL, обращайте больше внимания на значение подготовленного оператора. Приведенный выше код был бы безопасным, если бы он был подготовленным оператором, поскольку функции базы данных знали бы, что 1 OR 1=1 не является действительным литералом.

Что касается htmlspecialchars() . Это собственное минное поле.

В PHP есть реальная проблема, заключающаяся в том, что у него есть целый ряд различных экранирующих функций, связанных с html, и нет четких указаний относительно того, какие именно функции делают и для чего.

Во-первых, если вы находитесь внутри тега HTML, у вас серьезные проблемы. смотреть на

Мы уже внутри тега HTML, поэтому нам не нужно сделать что-нибудь опасное. Наш вектор атаки может быть javascript:alert(document.cookie)

Теперь результирующий HTML выглядит как

Атака проходит прямо через.

Становится хуже. Зачем? так как htmlspecialchars (когда вызывается таким образом) кодирует только двойные кавычки, а не одинарные. Так что, если бы мы имели

Наш злой злоумышленник теперь может вводить совершенно новые параметры

В этих случаях нет никакой волшебной пули, вам просто нужно самостоятельно проверить ввод. Если вы попытаетесь отфильтровать плохих персонажей, вы обязательно потерпите неудачу. Выберите подход из белого списка и пропустите только те символы, которые хороши. Посмотрите на Шпаргалка XSS например, как разные векторы могут быть

Даже если вы используете htmlspecialchars($string) вне HTML-тегов вы по-прежнему уязвимы для многобайтовых векторов атак с использованием кодировки.

Самое эффективное, что вы можете сделать, — это использовать комбинацию mb_convert_encoding и htmlentities следующим образом.

Даже это делает IE6 уязвимым из-за того, как он обрабатывает UTF. Однако вы можете использовать более ограниченную кодировку, такую ​​как ISO-8859-1, до тех пор, пока не прекратится использование IE6.

Для более глубокого изучения многобайтовых проблем см. https://stackoverflow.com/a/12118602/1820

В дополнение к отличному ответу Cheekysoft:

  • Да, они будут держать вас в безопасности, но только если они используются абсолютно правильно. Используйте их неправильно, и вы по-прежнему будете уязвимы, и у вас могут возникнуть другие проблемы (например, повреждение данных)
  • Пожалуйста, используйте вместо этого параметризованные запросы (как указано выше). Вы можете использовать их, например, через PDO или через оболочку типа PEAR DB
  • Убедитесь, что magic_quotes_gpc и magic_quotes_runtime всегда выключены и никогда не включаются случайно, даже на короткое время. Это ранняя и глубоко ошибочная попытка разработчиков PHP предотвратить проблемы безопасности (которые уничтожают данные)

На самом деле не существует серебряной пули для предотвращения внедрения HTML (например, межсайтовый скриптинг), но вам, возможно, удастся добиться этого проще, если вы используете библиотеку или систему шаблонов для вывода HTML. Прочитайте документацию для этого, чтобы узнать, как избежать этого.

В HTML вещи должны быть экранированы по-разному в зависимости от контекста. Это особенно верно для строк, помещаемых в Javascript.

Я бы определенно согласился с приведенными выше постами, но у меня есть одна небольшая вещь, которую нужно добавить в ответ на ответ Cheekysoft, а именно:

Когда дело доходит до запросов к базе данных, всегда старайтесь использовать готовый параметризованные запросы. Мысли и Библиотеки PDO поддерживают это. Это бесконечно безопаснее, чем использовать побег такие функции, как mysql_real_escape_string.

Да, mysql_real_escape_string фактически просто выходящая строка функция. Это не волшебная пуля. Все, что он сделает, это сбежать опасно символы для того, чтобы они могли быть безопасно использовать в одной строке запроса. Однако, если вы не продезинфицировать заранее, то вы будете уязвимы для определенных векторов атаки.

Представьте себе следующий SQL:

$ result = «ВЫБРАТЬ поля из таблицы Где ]);

Вы должны быть в состоянии увидеть, что это уязвимы для использования. Представьте себе идентификатор параметр содержит общую атаку вектор:

Там нет рискованных символов там закодировать, чтобы он прошел прямо через выходящий фильтр. уход нас:

ВЫБРАТЬ поля из таблицы ГДЕ >

Я написал небольшую быструю функцию, которую я поместил в свой класс базы данных, который удалит все, что не является числом. Он использует preg_replace, так что есть немного более оптимизированная функция, но она работает в крайнем случае.

Так что вместо использования

$ result = «SELECT поля ИЗ таблицы WHERE );

я хотел бы использовать

$ result = «SELECT поля ИЗ таблицы WHERE );

и это будет безопасно выполнить запрос

Конечно, это просто остановило отображение правильной строки, но я не думаю, что это большая проблема для тех, кто пытается внедрить sql в ваш сайт;)

Важная часть этой загадки — контексты. Тот, кто отправляет «1 ИЛИ 1 = 1» в качестве идентификатора, не является проблемой, если вы цитируете каждый аргумент в своем запросе:

что неэффективно. Поскольку вы экранируете строку, входные данные не могут выйти из контекста строки. Я протестировал это до версии 5.0.45 MySQL, и использование строкового контекста для целочисленного столбца не вызывает никаких проблем.

Хорошо работает, даже лучше на 64-битных системах. Остерегайтесь ограничений ваших систем при работе с большими числами, но для идентификаторов баз данных это работает отлично в 99% случаев.

Вы также должны использовать одну функцию/метод для очистки ваших значений. Даже если эта функция является просто оболочкой для mysql_real_escape_string(). Зачем? Потому что в один прекрасный день, когда обнаружен эксплойт к вашему предпочтительному методу очистки данных, вам нужно обновить его только в одном месте, а не в общесистемном поиске и замене.

почему, о ПОЧЕМУ, вы не включили бы кавычки вокруг пользовательского ввода в своем выражении sql? кажется довольно глупо, чтобы не! включение кавычек в ваш оператор sql сделает «1 или 1 = 1» бесполезной попыткой, не так ли?

так что теперь, вы скажете, «что если пользователь включит кавычку (или двойные кавычки) во входные данные?»

ну, это легко исправить: просто удалите пользовательские вводимые кавычки. например: input =

s/’//g; . теперь мне все равно кажется, что пользовательский ввод будет защищен.

Илон Маск рекомендует:  Что такое код swfdisplayitem &#62;skewy
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL