[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Использование htmlspecialchars при выводе из базы
Guest2011
На странице http://irbis-team.com/15/10/2 прочитал, что надо всегда обрабатывать данные перед выводом в поток функцией htmlspecialchars().
Данные выводимые из базы в заголовок title обработались без проблем.
А вот вывод основного контента:
<?php echo htmlspecialchars($myrow['text']); ?> 

вывелся из базы не просто как текст, а с тегами.
Т.к. в базе у меня в таблице поле text размечено тегами.
Подскажите, пожалуйста, надо ли обрабатывать функцией htmlspecialchars вывод этого поля или каким другим способом произвести правильный вывод из базы, чтобы не было видно тегов разметки.



Спустя 13 минут, 57 секунд (24.12.2010 - 23:23) divine266 написал(а):
strip_tags($var); вроде так wink.gif

Спустя 7 минут, 2 секунды (24.12.2010 - 23:30) Guest2011 написал(а):
А такой вариант не подойдет?

<?php echo htmlspecialchars_decode($myrow['text']); ?> 


Как правильнее?

Спустя 3 минуты, 47 секунд (24.12.2010 - 23:33) divine266 написал(а):
<?php echo strip_tags(htmlspecialchars($myrow['text'])); ?>

Спустя 6 минут, 36 секунд (24.12.2010 - 23:40) Guest2011 написал(а):
<?php echo strip_tags(htmlspecialchars($myrow['text'])); ?> не произвело эфекта - всё равно теги видны

Спустя 3 минуты, 14 секунд (24.12.2010 - 23:43) DmitryOpalev написал(а):
Теги и так будут видны, он заменяются на &#186; что-то типа этого, а потом в браузере заменяются на углы... если надо чтобы выдавало прямо &#186 то пиши
echo hmlspecialchars(htmlspecialchars($str));

Спустя 14 минут, 54 секунды (24.12.2010 - 23:58) Guest2011 написал(а):
echo hmlspecialchars(htmlspecialchars($myrow['text']));

непонятно зачем дважды писать hmlspecialchars.

но все равно непомагает выдает fatalerror

Спустя 19 минут, 2 секунды (25.12.2010 - 00:17) vasa_c написал(а):
Эпик-топик.
Не надо читать, что вот надо всё пихать в htmlspecialchars, а потом всё в неё и пихать и не думать.
Нужно разобраться с тем, что она делает.

Спустя 9 минут, 19 секунд (25.12.2010 - 00:26) Guest2011 написал(а):
Сложно сказать, что она делает.
Но я так понимаю, она нужна для того, чтобы обезопасить свой сайт он приёма каких-то ненужных символов.
И поэтому, кстати, непонятно зачем использовать эту функцию при выводе из базы. Если бы мы вводили данные, тогда понятно, для перестраховки. А при выводе же все данные безопасны т.к. введены нами. И там нет подозрительных тегов

Спустя 1 минута, 19 секунд (25.12.2010 - 00:28) divine266 написал(а):
если сложно сказать что она делает..лучше почитай мануал потом используй только ее wink.gif

Спустя 5 минут, 14 секунд (25.12.2010 - 00:33) Guest2011 написал(а):
гениально.

Спустя 5 минут, 32 секунды (25.12.2010 - 00:38) Guest написал(а):
Guest2011
опасны сами символы <> , а то, во что их превращает эта функция - уже не опасно)) говоря простым языком.
Если ты думал, что она просто выкидывает все спецсимволы из строки - ты ошибался)

Спустя 15 минут, 14 секунд (25.12.2010 - 00:54) Guest2011 написал(а):
да хоть оно и не опасно, но оно портит вид страницы.
надо же как-то убрать теги, отобразившиеся после использования функции
от видимости посетителей

Спустя 10 минут, 47 секунд (25.12.2010 - 01:05) twin написал(а):
Так, так... Стойте. Вы чего тут развели?

Вам умный человек сказал
Цитата
Не надо читать, что вот надо всё пихать в htmlspecialchars, а потом всё в неё и пихать и не думать.
Нужно разобраться с тем, что она делает.

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

Так что лечить нужно причину (поповскую доктрину), а не следствие

Спустя 4 минуты, 28 секунд (25.12.2010 - 01:09) Guest2011 написал(а):
Я же и пытаюсь узнать как правильно вывести текст из базы.
А что получается, что надо хранить текст в базе без тегов.

У Е.Попова есть файл view_post, который выводит разные страницы в зависимости от id, переданного методом GET.Если использовать в базе только чистый текст без тегов, то тогда для вывода каждой страницы надо будет создавать собственный файл, ведь содержимое не шаблонное а отличается . А так всё компактно выводится одним файлом view_post

Т.е. если текста очень много и я его держу в поле text где же тогда хранить теги?

Спустя 2 минуты, 56 секунд (25.12.2010 - 01:12) twin написал(а):
Что есть у пОпова, надо засунуть туда, от чего происходит его фамилия.
Я не собираюсь опять рыться в этом дерьме. Достаточно этого.

Спустя 8 минут, 6 секунд (25.12.2010 - 01:20) Invis1ble написал(а):
Guest2011
Цитата
А что получается, что надо хранить текст в базе без тегов


Спустя 1 час, 10 минут, 18 секунд (25.12.2010 - 02:30) twin написал(а):
Вот вам и пожалуйста. А вы говорите попов хорош для тычка.

Щас человеку жаль своего сайта, он же делал его долго и мучительно, под монотонное соплежувалово жени (это еще выдержать надо), да еще не дай Бог заплатил полтора косаря за это дерьмо. А теперь ему приходится метаться по форумам с тайной надеждой, что его не нае обманули в лучших чувствах, что все вокруг идиоты, а истина где то рядом, стоит только две буквы изменить.

На выйдет.

Спустя 33 минуты, 25 секунд (25.12.2010 - 03:04) m4a1fox написал(а):
Я конечно извиняюсь, но как насчет функции
html_entity_decode?

Функция html_entity_decode — Преобразует HTML сущности в соответствующие символы

Спустя 25 минут, 24 секунды (25.12.2010 - 03:29) twin написал(а):
Есть еще htmlspecialchars_decode(), причем тут это?

Спустя 1 час, 16 минут, 10 секунд (25.12.2010 - 04:45) inpost написал(а):
Guest2011
Получается, что надо действовать от ситуации, когда применять одну функцию, когда другую, когда писать ББ-декодер.
Более подробно на сайте irbis-team.com
Так же советую заглянуть в мою подпись, там много полезного.

Смотри, если безопасно ввёл данные, значит и обрабатывать не надо. Зачем, если сам же вводил? Если же это чат, то тут без ББ-декодера не разобраться.

Спустя 9 часов, 9 минут, 55 секунд (25.12.2010 - 13:55) Guest2011 написал(а):
Это не чат. Это просто файл веб-страница, который генерирует в зависимости от переданного в него методом GET id другие страницы. Если Вы читали ссылку в моём первом посте, то там на этой странице разбирается как создать не чат, а обычную страницу, которая из базы выводит содержимое поля text.
Ладно придется разбираться без вашей помощи. Читать учебники. Разберусь и без вас

Спустя 23 минуты, 27 секунд (25.12.2010 - 14:19) Guest написал(а):
Guest2011
смешной ты ) тут разбираться-то нечего, ты просто определись что тебе вообще нужно конкретно и все.

Спустя 3 минуты, 17 секунд (25.12.2010 - 14:22) Guest написал(а):
если тебе нужно просто избавиться от тэгов попробуй strip_tags()
а если что-то еще - составь себе регулярку.

Спустя 2 часа, 23 минуты, 26 секунд (25.12.2010 - 16:45) inpost написал(а):
Guest2011
глупый, чтоли?
Если в TEXT попадает информация ОТ ПОЛЬЗОВАТЕЛЯ, то надо обезопасить, если в TEXT попадает информация от администрации, которая сама себя ломать не будет - тогда не надо использовать защиту.

Спустя 1 час, 34 минуты, 31 секунда (25.12.2010 - 18:20) m4a1fox написал(а):
inpost
Поддерживаю - правильно сказал.

Спустя 3 минуты, 9 секунд (25.12.2010 - 18:23) Guest2011 написал(а):
Тогда зачем twin в своей статье говорит, что надо обрабатывать?

Цитирую "Так вот, чтобы такого никогда не было, нужно всегда обрабатывать данные перед выводом в поток функцией htmlspecialchars()"
ссылка на статью http://irbis-team.com/15/10/2

Спустя 8 минут, 57 секунд (25.12.2010 - 18:32) m4a1fox написал(а):
Смотри, поставь перед своим выводом вот это '.html_entity_decode($myrow['text'],ENT_QUOTES).' - и попробуй. Напишешь что произошло?!

Спустя 1 минута, 14 секунд (25.12.2010 - 18:33) inpost написал(а):
Guest2011
Это относится к descriptions, keywords, данным различных форм (во время редактирования).
А если так:
$text = bbDecoder(htmlspecialchars($text));
Всё, теперь основные теги работают, все ненужное - вырезали. bbDecoder - самописная функция, которая заменяет [b] на <strong>. Поэтому сначала уберутся все спецсимволы из того текста, потом заменятся [ b] на <strong>, и мы получим отформатированный текст. Как на этом форуме. Попробуй написать отдельно <strong> - ничего не выйдет, а если [ b] - всё работает.

Спустя 8 минут, 56 секунд (25.12.2010 - 18:42) Invis1ble написал(а):
Guest2011
Цитата
Тогда зачем twin в своей статье говорит, что надо обрабатывать

ты вырвал фразу из контекста

Спустя 1 минута, 39 секунд (25.12.2010 - 18:44) Guest2011 написал(а):
Цитата
Если в TEXT попадает информация ОТ ПОЛЬЗОВАТЕЛЯ, то надо обезопасить, если в TEXT попадает информация от администрации, которая сама себя ломать не будет - тогда не надо использовать защиту.

Т.е. если я собственноручно ввёл информацию в базу, то можно не переживать и не обрабатывать её функциями. А обрабатывается только ввод в формы т.е. та информация которая добавляется пользователем ?
Цитата
Это относится к descriptions, keywords, данным различных форм

Ну формы то понятно надо обрабатывать.
А зачем descriptions, keywords ведь их я прописываю сам в базе.

Поэтому зачем было писать "нужно всегда обрабатывать данные перед выводом в поток функцией htmlspecialchars()"


Спустя 6 минут, 32 секунды (25.12.2010 - 18:50) Guest2011 написал(а):
Цитата
ты вырвал фразу из контекста

контекст был такой:
"Так вот, чтобы такого никогда не было, нужно всегда обрабатывать данные перед выводом в поток функцией htmlspecialchars()"
и дальше идет то к чему применяется функция

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta
name="description" content="<?php echo htmlspecialchars($myrow['meta_d']); ?> ">
<meta
name="keywords" content="<?php echo htmlspecialchars($myrow['meta_k']); ?> ">
<meta
http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title><?php
echo htmlspecialchars($myrow['title']); ?></title>
<link
href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<?php
echo htmlspecialchars($myrow['text']); ?>
</body>
</html>


Тут же не предполагается ввода данных пользователем. Зачем применять функцию. Вот о чем я. Поля text, title, description, keywords заполняются из базы или в крайнем с лучае из админки

Спустя 3 минуты, 49 секунд (25.12.2010 - 18:54) Invis1ble написал(а):
Guest2011
Цитата
Тут же не предполагается ввода данных пользователем

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

Спустя 1 минута, 33 секунды (25.12.2010 - 18:56) m4a1fox написал(а):
Guest2011
Может для того, что бы ты случайно себя же не хакнул?! smile.gif

Спустя 17 минут, 22 секунды (25.12.2010 - 19:13) Guest2011 написал(а):
Цитата
Если в TEXT попадает информация ОТ ПОЛЬЗОВАТЕЛЯ, то надо обезопасить, если в TEXT попадает информация от администрации, которая сама себя ломать не будет - тогда не надо использовать защиту.


Цитата

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


Две фразы несколько противоположные одна другой. В одной говорится, что если данные ввел админ, то волноваться не стоит, а вторая что всёже админ может где-то ошибится.
Ну допустим, нужно учитывать второй вариант. И для перестраховки всё же надо ВСЕ данные обесопасить функцией htmlspecialchart.
Тогда как это реализовать?
Вывод страниц генерируется одним файлом. Выводится разное содержимое, в зависимости от id переданного методом GET из страницы в саму себя. Но содержимое выводимое ведь не шаблонное. А на каждой страницы своё. Поэтому как организовать вывод страниц так, чтобы не делать для каждой свой файл, а как и предполагалось генерировать страницы одним файлом? непонятно mellow.gif

Спустя 3 минуты, 44 секунды (25.12.2010 - 19:17) m4a1fox написал(а):
Cначала реши какая структура сайта будет у тебя. Где данные будут храниться (понятно что в БД) - в каких таблица? Вернее даже в какой? Одна таблица - много строк с данными, и вытаскивай их по id.

Спустя 6 минут, 48 секунд (25.12.2010 - 19:24) inpost написал(а):
Guest2011
Различай информацию, находящуюся как описание страницы, как тело страницы, как информация, полученная от пользователя, информация полученная от администратора, и информация, полученная от простого управляющего сайтом.
Сделал ты сайт блондинке, она не знает, что в metakeys нельзя помещать спец.символы, поэтому обезопасил себя от притензий. Есть тело документа, куда выводится информация страницы - тут уже можно и не заниматься безопасностью, если уверен в его содержимом, а вот информацию, приходящую от пользователя надо дважды проверить.

А насчет вывода страниц - я так и не понял, что ты этим хотел сказать. Структуры бывают разные, не смотря на то, что я сейчас работаю по модели Ирбиса, свои личные проекты я делаю на упрощенной MVC.

Спустя 2 минуты, 6 секунд (25.12.2010 - 19:26) Invis1ble написал(а):
Guest2011
Капец...
1. в БД хранишь без тегов (с псевдотегами при надобности)
2. выводишь в браузер, обработав htmlspecialchars и ф-цией для преобразования псевдотегов

Всё.

Спустя 6 минут, 48 секунд (25.12.2010 - 19:33) m4a1fox написал(а):
Invis1ble
А если я использую FCKEditor - тоже псевдотегами пользоваться?

Спустя 3 минуты, 56 секунд (25.12.2010 - 19:36) Guest2011 написал(а):
Цитата

Есть тело документа, куда выводится информация страницы - тут уже можно и не заниматься безопасностью, если уверен в его содержимом

Я же и говорю, что данные в базу буду вводить собственноручно через phpmyadmin. И поэтому и хочу прояснить для себя, что обязательно ли их потом пропускать через функции.


Спустя 1 минута, 48 секунд (25.12.2010 - 19:38) Invis1ble написал(а):
m4a1fox
к сожалению, а может к счастью, я не знаю, что есть FCKEditor...

Guest2011
Цитата
Я же и говорю, что данные в базу буду вводить собственноручно через phpmyadmin. И поэтому и хочу прояснить для себя, что обязательно ли их потом пропускать через функции.

в таком случае - нет

Спустя 1 минута, 53 секунды (25.12.2010 - 19:40) m4a1fox написал(а):
Invis1ble
Ладно.... Тогда проехали

Спустя 12 минут, 34 секунды (25.12.2010 - 19:53) twin написал(а):
Guest2011
Цитата
Тут же не предполагается ввода данных пользователем. Зачем применять функцию. Вот о чем я. Поля text, title, description, keywords заполняются из базы или в крайнем с лучае из админки
Читать нужно было внимательнее. Вот это место:
Цитата
Как это может попасть в базу, я не покажу по известным причинам. Но поверьте, это не так уж сложно на таком сайте. Называется сие - XSS или межсайтовый скриптинг.
Дело в том, что информация в базу может попасть не только из админки, но и другими путями. В частности через SQL-инъекцию.

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

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

Спустя 53 минуты, 29 секунд (25.12.2010 - 20:46) m4a1fox написал(а):
Вопрос почти в тему! Как заменить одинарный апостроф на
&rsquo;

Спустя 1 минута, 51 секунда (25.12.2010 - 20:48) inpost написал(а):
Если только его, то str_replace =)

Спустя 1 минута, 59 секунд (25.12.2010 - 20:50) m4a1fox написал(а):
inpost
Хотя это не настолько важно.

Спустя 13 минут, 23 секунды (25.12.2010 - 21:03) Guest2011 написал(а):
Хорошо. Разобрались.Всё же в любом случае если даже текст введен собственноручно в базу:
Цитата
ни в коем случае нельзя хранить гипертекст в базе.


тогда как-же держать текст в базе и как его выводить?

Допустим текст в базе хранится без тегов.
Php-файл генерирует вебстраницы на основе id(переданного самому себе). Если текст в базе в поле text без тегов то как его выводить? Как указать что это один абзац, это следующий, это заголовок и т.п.?

Спустя 5 минут, 40 секунд (25.12.2010 - 21:09) twin написал(а):

Спустя 27 минут, 52 секунды (25.12.2010 - 21:37) vasa_c написал(а):
Вот это форум программистов (якобы), здесь часто пишут в вопросах HTML-код и SQL-запросы.
Все эти тексты идут в базу данных, а потом выводятся на страницах.
Если предположить, что никто не хочет ничего ломать, стоит ли экранировать данные?

Спустя 33 минуты, 28 секунд (25.12.2010 - 22:10) twin написал(а):
Стоит ли что делать, простите?

Спустя 24 минуты, 24 секунды (25.12.2010 - 22:35) vasa_c написал(а):
экранировать, ничего-ничего

Спустя 3 минуты, 2 секунды (25.12.2010 - 22:38) twin написал(а):
Я просто не улавливаю связи между экранированием и сабжем. По этому вопрос понятен чуть менее чем нисколько.

Спустя 30 минут, 24 секунды (25.12.2010 - 23:08) vasa_c написал(а):
В частности связь с этим:
Цитата
Если в TEXT попадает информация ОТ ПОЛЬЗОВАТЕЛЯ, то надо обезопасить, если в TEXT попадает информация от администрации, которая сама себя ломать не будет - тогда не надо использовать защиту.

Спустя 15 часов, 6 минут, 24 секунды (26.12.2010 - 14:15) alex12060 написал(а):
Я делаю так:


function protect($string) {
$string = mysql_real_escape_string($string);
$string = strip_tags($string);
$string = addslashes($string);
$string = htmlspecialchars($string);
$string = trim($string);

return $string;
}

Спустя 9 минут, 25 секунд (26.12.2010 - 14:24) vasa_c написал(а):
alex12060, для каких целей вы это делаете?

Спустя 8 минут, 31 секунда (26.12.2010 - 14:33) Guest написал(а):
alex12060
жесть)

Спустя 12 минут, 29 секунд (26.12.2010 - 14:45) ZSH написал(а):
Это не жесть, это параноя.

Спустя 1 час, 48 минут, 6 секунд (26.12.2010 - 16:33) kovaldm написал(а):
alex12060
Я бы еще добавил stripslashes и unset.
Чтобы уж прям наверняка проблем не было.

Спустя 2 минуты, 49 секунд (26.12.2010 - 16:36) twin написал(а):
format c
чего мучаться...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.