htmlspecialchars и ENT_QUOTES не работают?

В основном при отображении данных из базы данных MySQL у меня есть функция htmlspecialchars() ниже, которая должна преобразовывать одинарные и двойные кавычки в их безопасные объекты. Проблема, с которой я сталкиваюсь, заключается в просмотре исходного кода, он преобразует только < > &, когда мне также нужно преобразовать одинарные и двойные кавычки.

//sanitize data from db before displaying on webpage
function htmlsan($htmlsanitize){
    return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}

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

htmlsan($row['comment']);

Может кто-нибудь сказать мне, почему он не конвертирует одинарные и двойные кавычки?

ОБНОВЛЕНИЕ

Странно то, что htmlsan() используется в комментариях в электронной почте, и когда я просматриваю исходный код электронной почты, он их преобразует, кажется, что он не будет преобразовывать одинарные/двойные кавычки из базы данных при отображении на веб-странице. Моя сортировка базы данных также установлена ​​​​на utf8_general_ci, и я заявляю, что использую utf8 для подключения к базе данных и т. д.


person PHPLOVER    schedule 18.01.2011    source источник
comment
Это проблема с опечаткой htmlan($row['comment']);? если вы вызываете другую функцию   -  person Shakti Singh    schedule 18.01.2011
comment
Привет, нет, это не опечатка, я просто перепроверил, я сделал опечатку при публикации этого вопроса, извините, но в реальном коде опечатки нет.   -  person PHPLOVER    schedule 18.01.2011
comment
просто вызов htmlsan($row['comment']); не повлияет на переменную в вашем коде   -  person Your Common Sense    schedule 18.01.2011
comment
Привет, Коля, что ты имеешь в виду? я думал, что пример, показанный выше, будет работать, он определенно работает с ‹ › &, но не с одинарными/двойными кавычками.   -  person PHPLOVER    schedule 18.01.2011
comment
Чувак. Вам крайне необходимо опубликовать точный и полный пример, а не очередную пустую болтовню.   -  person Your Common Sense    schedule 18.01.2011


Ответы (5)


Как именно вы его тестируете?

<?php

//sanitize data from db before displaying on webpage
function htmlsan($htmlsanitize){
    return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}

var_dump(htmlsan('<>\'"'));

... печатает:

string(20) "&lt;&gt;&#039;&quot;"

Я предполагаю, что ваша входная строка исходит из Microsoft Word и содержит типографские кавычки:

var_dump(htmlsan('“foo”')); // string(9) "“foo”" 

Если вам нужно преобразовать их по какой-либо причине, вам нужно htmlentities(), а не htmlspecialchars():

var_dump(htmlentities('“foo”', ENT_QUOTES, 'UTF-8')); // string(17) "&ldquo;foo&rdquo;"

Обновление №1

Ладно, пришло время для надлежащего тестирования. Введите одинарную кавычку (') в поле базы данных comment и запустите следующий код, когда получите ее:

var_dump(bin2hex("'"));
var_dump(htmlspecialchars("'", ENT_QUOTES, 'UTF-8'));
var_dump(bin2hex($row['comment']));
var_dump(htmlspecialchars($row['comment'], ENT_QUOTES, 'UTF-8'));

Он должен напечатать это:

string(2) "27"
string(6) "&#039;"
string(2) "27"
string(6) "&#039;"

Пожалуйста, обновите свой вопрос и подтвердите, выполнили ли вы этот тест и получили тот же или другой результат.

Обновление №2

Пожалуйста, внимательно посмотрите на результат, который, как вы утверждаете, вы получаете:

string(6) "'"

Это не строка из 6 символов. Вы не смотрите на настоящие выходные данные: вы смотрите на выходные данные, обработанные браузером. Я почти уверен, что вы получаете ожидаемый результат, то есть string(6) "&#039;". Если вы визуализируете &#039; с помощью веб-браузера, он становится '. Воспользуйтесь меню Просмотр исходного кода в браузере, чтобы увидеть реальный результат.

person Álvaro González    schedule 18.01.2011
comment
Привет, это не из Microsoft Word, это данные из базы данных, и я сам набрал их при тестировании на клавиатуре, без копирования или вставки. Также не уверен, почему вы говорите, что я должен использовать htmlentities(), поскольку htmlspecialchars() должен работать в соответствии с руководством по PHP. - person PHPLOVER; 18.01.2011
comment
htmlentities() преобразует большинство символов, отличных от ASCII, в объекты HTML, а htmlspecialchars() преобразует только пять определенных символов. Вы уверены, что ваши кавычки являются настоящими 7-битными ASCII-кавычками? Как вы это тестировали? - person Álvaro González; 18.01.2011
comment
Привет, я просто набрал кавычки (одинарные/двойные) в текстовом поле с помощью клавиатуры. Это не сложный код и ничего, что могло бы вызвать проблемы. Затем я создал пустую страницу с простой формой и попытался, но снова кавычки не были преобразованы. Я также не использовал эту функцию и просто попытался обернуть htmlspecialchars($string, ENT_QUOTES) и преобразовать только следующие 3 символа ‹ › & . Я попробовал htmlentities, но он не конвертирует ‹ › & для меня и может быть проблемой, так как данные необходимо очищать при отображении из базы данных. - person PHPLOVER; 19.01.2011
comment
Привет Альваро, очень ценю ваше время и помощь. Это то, что он распечатал на экране, введя одинарную кавычку string(6) ' string(2) 27 string(6) ' string(2) 27 Спасибо - person PHPLOVER; 19.01.2011
comment
Предлагается обновить вопрос, потому что вы можете отформатировать вывод, чтобы сделать его читаемым, вы можете опубликовать точный код, который вы запустили, и информация актуальна для всех. Неважно, смотрите мое второе обновление. - person Álvaro González; 19.01.2011
comment
Привет Альваро. Просмотр источника показывает то же самое. Я сделал это в любом случае, просматривая исходный код, очевидно, поскольку браузер покажет его так, как предполагалось, но просмотр исходного кода покажет его в безопасной форме. строка(6) ' строка(2) 27 строка(6) ' строка(2) 27 спасибо - person PHPLOVER; 19.01.2011
comment
Привет Альваро, пожалуйста, прочитайте комментарий выше. Я только что заметил, что это на самом деле работает: O Причина, по которой я просматриваю исходный код с помощью Firebug в FireFox, а Firebug не показывает его, как если бы вы перешли в «Просмотр исходного кода» в меню браузера. Мне очень жаль, но я никогда не знал, что Firebug работает, показывает это так, как это показывает веб-страница, я думал, что это покажет это, как когда вы просматриваете исходный код, как если бы вы сделали это через сам браузер. - person PHPLOVER; 19.01.2011
comment
Ну да, вкладка Firebug HTML декодирует объекты HTML (я тоже этого не заметил). В любом случае, я рад, что у тебя все получилось. По крайней мере, вы узнали пару советов по отладке :) - person Álvaro González; 19.01.2011
comment
Да, и благодаря вашему упорному труду. Очень ценю ваше время и усилия :) - person PHPLOVER; 19.01.2011
comment
Обновление 2 помогло. Спасибо что подметил это. Мне тоже этого не хватало. - person Rich; 26.11.2020

Когда вы просматриваете исходный код с помощью Firebug, Firebug показывает его так, как его отображает веб-браузер, я думал, что он покажет исходный код так же, как если бы вы перешли к просмотру исходного кода в строке меню браузера. Головной болью научились и запомнят. Спасибо всем за ваше драгоценное время и вклад.

person PHPLOVER    schedule 19.01.2011
comment
Столкнулся с той же проблемой. Тестирование с помощью исходного кода FireFox — полная ерунда с htmlentities($str,ENT_QUOTES, "UTF-8");, а одинарная кавычка отображается как одинарная кавычка. Если у вас есть расширение для веб-разработчиков Криса Педрика и вы выполняете исходный код через него, вы увидите, что одинарная кавычка отображается как &#039;. Мораль этой истории: используйте необработанный источник просмотра, который не очищает HTML-код вашей страницы, чтобы вы могли сказать, что все работает. - person Fiasco Labs; 27.01.2013

Была такая же проблема. Моя база данных с utf-8_unicode_ci и моей html-кодировкой utf-8, а htmlentities конвертирует только все, кроме кавычек. Я думал, что одинаковая кодировка в db и html будет работать нормально, но это не так. Поэтому я изменил кодировку в html на iso-8859-1, и это сработало. Не знаю почему, но это сработало. Моя БД все еще с utf-8_unicode_ci.

person Carolina    schedule 06.11.2014
comment
Это была проблема, с которой я столкнулся. Спасибо. - person Blake Frederick; 11.08.2016

Не уверен, что это будет иметь значение, но пробовали ли вы удалить файл $htmlsanitize.

function htmlsan($htmlsanitize){
    return htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8');
}
person Matt Lowden    schedule 18.01.2011
comment
Привет, Мэтт, спасибо за ответ, очень признателен, по какой-то причине он по-прежнему не конвертирует одинарные и двойные кавычки, но конвертирует ‹ › & - person PHPLOVER; 18.01.2011

С использованием

htmlentities($htmlsin, ENT_QUOTES, 'UTF-8');

or

mb_convert_encoding($htmlsan, "HTML-ENTITIES", "UTF-8");

Вероятно, они сделают то, что вы хотите.

person Dai    schedule 18.01.2011
comment
Привет, первый вариант — это то, что у меня уже есть, а второй вариант не преобразует возможные вредоносные теги, такие как javascript и т. д., в безопасный объект, такой как ‹ › . - person PHPLOVER; 18.01.2011