Эта тема на forum.dklab.ru


Anonymous: htmlspecialchars()
Скажите а что даёт ф-я htmlspecialchars()? По идее она может защитить от вставки злоумышленниками html-тегов? Больше ведь ни отчего? Или её полезно использовать и в других случиях?
Ant:
RTFM.
Юрий Насретдинов:
Или её полезно использовать и в других случиях
Её очень полезно использовать, когда, например, нужно быстренько поставить защиту от хакера на сайт, и привести его в порядок:


<?
//начало основного скрипта
foreach($_POST as $k=>$v) $_POST[$k]=nl2br(str_replace("'","\'",htmlspecialchars($v)));
?>

Dmitri R. S.:
Гость:
Также можно использовать для правильного вывода не-НТМЛ-форматированного текста со знаками < >, умлаутами (&#252; &#246; &#228;) и прочими спецзнаками.
Дмитрий Котеров:
str_replace("'","\'"
Это лишнее. Зачем? Апострофы и так заменяются вроде бы.

Да и потом, заменять что-то в $_POST — это ужасная техника, идеологически неверная. Лучше делать замену непосредственно перед тем, как данные будут куда-то выведены или вставлены.
Юрий Насретдинов:
Дмитрий Котеров:
Ну, если данные только и делают, что вставляются или обновляются (например админка), и нужно сразу подгонять данные под SQL-запрос, я думаю, такая техника лучше всего подходит
Anonymous:
str_replace("'","\'",
А зачем через str_replace. Разве ф-и addslashes() или mysql_escape_string не делают тоже самое?
Юрий Насретдинов:
mysql_escape_string не делают тоже самое
mysql_escape_string - может быть даже лучше. addslashes делает совсем не то, что нужно, ИМХО. Он вставляет свои слеши везде, а нужно только в нескольких местах
Anonymous:
Он вставляет свои слеши везде, а нужно только в нескольких местах
Всмысле везде? Помоему она вставляет слэши перед символом одинарной и двойной кавычки. А что Вы имели ввиду в фразе
а нужно только в нескольких местах


Да, а разве mysql_escape_string и addslashes не одинаковы в работе. Если нет, то какую лучше использовать (и почему)?
Дмитрий Котеров:
а разве mysql_escape_string и addslashes не одинаковы в работе
Совершенно не одинаковы.

Для работы с MySQL нужно использовать mysql-escape_string(). Что касается addslashes(), то она вообще не нужна, а необходимость в ее использовании возникает из-за неправильной архитектуры скрипта (вот как в yUAC-а).
Anonymous:
Дмитрий, а что же они тогда делают? Чем различаются?
Дмитрий Котеров:
А Вы в документации почитайте, в пользовательских комментариях.
http://php.net/mysql_escape_string
Anonymous:
Там все комментарии на английском :(. Может мо мне в двух словах объясните? Ели нет - то нет. :(
И ещё один вопросик. Надоли использовать htmlspecialchars для фильрации переменной, которая будет выводится в форме. Например:
<input type=\"text\" name=\"qwe\" value=\"$text\">
Переменную $text надо фильтровать?
Евгений Галашин:
Гость:
С точки зрения последнего стандарта HTML — да. Более того, в ссылках надо писать не ...?a=1&b=2, a ...?a=1&amp;b=2
Дмитрий Котеров:
С точки зрения последнего стандарта HTML
Даже, кажется, и с точки зрения самого первого стандарта — тоже надо. (-;

А если надоело фильтровать, http://php.dklab.ru/FormPersister/

Там все комментарии на английском
Английский надо учить, без этого программисту никуда.
Anonymous:
Английский надо учить, без этого программисту никуда
У меня всё впереди..................
Anonymous:
У меня опять вопрос по теме возник.
Если надо в mysql выбрать даные для изменения и разместить их в поле input для изменения, то получится следующее:
print "<input type=\"text\" name=\"txt\" value=\"".htmlspecialchars($text)."\">";
И если $text будет содержать следующий текст: "qweqwe "qweqweqweqew", то кавычки будут заменены на html-овский эквивалент - &quot;. И получается что после отправки данных и занесения их в mysql вместо кавычек занесётся html-овский эквивалент?
Дмитрий Котеров:
Не получится. Проверьте сами.
Anonymous:
То бишь если из формы отправить &quot; , то при получении она приобразуется в " ?
Anonymous:
Да и ещё в элементе select в option надо фильтровать всё: и текст, который виден и value
<option value=\"".htmlspecialchars($val)."\">".htmlspecialchars($val)."</option>
И вообще надо фильтровать только то, что выводится пользователю или даже то, что он не видит, например <input type="hidden">.
Евгений Галашин:
Гость:
нет. Если броузеру отправить &quot;, то он его преобразует в ".
Anonymous:
нет. Если броузеру отправить &quot;, то он его преобразует в ".
Я точно также и сказал. Может Вас смутил ? после кавычки? Это я как конец предложения его написал, а не как часть того, во что преобразуется &quot;.
Юрий Насретдинов:
Гость:
&quot; соотвественно преобраузется в &amp;quot; и показывается как &quot; . Неужели это непонятно ?
Евгений Галашин:
Гость:
ИМХО Вы путаете причину и следствие.
Дмитрий Котеров:
Во всех атрибутах всех тэгов значения должны быть преобразованы при помощи функции htmlspecialchars(). Таков стандарт. При этом браузер при считывании страницы проводит обратное преобразование, так что в его внутренних структурах и переменных никаких &quot; уже нет (кстати, он еще в этот момент преобразует текст из windows-1251 или koi-8 в юникод - внутри браузера и JavaScript все хранится только в юникоде). Итак, браузер работает напрямую с ". И, соответственно, при отсылке формы данные идут в том виде, в котором имеются.
Anonymous:
Спасибо Дмитрий, всё понял.

Вопрос решен, тему можно закрыть.

Эта тема на forum.dklab.ru