Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/65: Рейтинг темы: голосов - 65, средняя оценка - 4.91
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522

Правильное сохранение кавычек

07.05.2012, 10:32. Показов 14789. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет!
Столкнулся с такой проблемой, при сохранении инфы из формы в БД я делаю так
PHP
1
mysql_real_escape_string(htmlspecialchars(trim($_POST['field_name'])))
.
Если в поле набрать кавычки, то в БД они сохраняются как " и выводятся соответственно также.
Как сделать чтобы в БД сохранялись обычные кавычки, хватает ли для защиты тока mysql_real_escape_string или htmlspecialchars тоже стоит использовать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.05.2012, 10:32
Ответы с готовыми решениями:

Сохранение с именем в ячейке с удалением кавычек
Здравствуйте. Суть проблемы Dim WA As Object, WD As Object sDirname = Application.ThisWorkbook.Path & "\" & CStr(Year(Date)) &...

Правильное сохранение данных
Всем доброго времени суток, столкнулся с проблемой в функции сохранения, данные она сохраняет, но плохо. Вот сама функция: void...

Правильное сохранение данных *rtf из RichTextBox
string arr_text = tabControl1.TabPages.Controls.Text.Split('\n'); File.WriteAllLines(S.FileName, arr_text, Encoding.GetEncoding(1251)); ...

10
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
07.05.2012, 11:32
Love_and_Peace, Юзер в форму вводит что? - вводит text/plain, т.е. ", &, < и > - это обычные символы:
Цитата Сообщение от Текст юзера
Приветствую. Вот код:
<input type="button" onclick="return confirm('Уверены?')" />
В БД в поле хранится что? Хранится тот же text/plain. Значит вносим text/plain как есть. Используем только mysql_real_escape_string(), чтобы правильно превратить text/plain в строковый литерал MySQL, который обозначает именно тот текст, который ввел юзер:
MySQL
1
'Приветствую. Вот код:\n<input type="button" onclick="return confirm(\'Уверены?\')" />'
Затем при выводе данных из БД в html страницу мы этот text/plain должны конвертировать в text/html, чтобы каждый символ означал сам себя, а не спецсимвол html. Для этого уже здесь мы используем htmlspecialchars():
PHP
1
2
3
echo '<div class="message">',
     htmlspecialchars($row['message']),
     '</div>';
HTML5
1
2
<div class="message">Приветствую. Вот код:
&lt;input type=&quot;button&quot; onclick=&quot;return confirm('Уверены?')&quot; /&gt;</div>
Если нам потребуется вывести текст в контексте JS кода, то при выводе из БД мы без труда сможем конвертировать прочитанный text/plain в text/javascript, чтобы получилось, например, следующее:
JavaScript
1
var message = 'Приветствую. Вот код:\n<input type="button" onclick="return confirm(\'Уверены?\')" />';
В общем случае должно быть именно так. Не нужно зря бессмысленно перегонять из пустого в порожнее.

В БД хранится ровно то, что было введено юзером. Благодаря этому юзер может написать абсолютно любой символ (иначе получится, что невозможно написать <, " или '? искусственные ограничения свободы слова). Если юзер или админ захочет исправить что-то в своем сообщении - он будет редактировать свой исходный текст, а не какой-то мусор (который после редактирования повторно через что-то пропустится? & -> &amp; -> &amp;amp; -> &amp;amp;amp;).


Другая сторона проблемы - производительность. Если мы выводим сотни сообщений по Nдесят КБ каждое, и каждое при этом пропускаем через htmlspecialchars(), то производительность явно пострадает. Для решения этой проблемы можно хранить в БД обе версии текста: и исходный text/plain, и сгенерированный из него text/html. При создании/редактировании сообщения юзер видит и пишет свой text/plain, а в БД вносятся оба варианта. При выводе на странице используется уже готовый text/html.
1
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
07.05.2012, 11:41  [ТС]
Vovan-VE, правильно ли я понимаю, что при сохранении в БД вабще не стоит использовать htmlspecialchars?

Добавлено через 51 секунду
кстати вот это вот
Цитата Сообщение от Vovan-VE Посмотреть сообщение
&lt;input type=&quot;button&quot; onclick=&quot;return confirm('Уверены?')&quot; /&gt;
как будет отображаться в браузере?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
07.05.2012, 11:48
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
правильно ли я понимаю, что при сохранении в БД вабще не стоит использовать htmlspecialchars?
Не стоит хранить в БД только результат htmlspecialchars. Ибо тогда у нас не будет оригинала. Чтобы отредактировать оригинал, нам придется конвертировать обратно. А зачем тогда вообще конвертировали?
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
как будет отображаться в браузере?
&lt; , &amp; и т.п. - это же html-сущности, каждая из которых рендерится одним символом.
HTML5
1
2
3
<pre>&lt;div class=&quot;foo bar&quot;&gt;
    ...
&lt;/div&gt;</pre>
1
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
07.05.2012, 11:56  [ТС]
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Не стоит хранить в БД только результат htmlspecialchars.
ну а для чего тогда вабще портить оригинал htmlspecialchars'ом? где эти сущности могут быть полезны?
Я читал про htmlspecialchars и знаю, что он нужен, чтобы не запустился случайно неких засланный код, ну тогда его полезно использовать на выходе, но никак при сохранении в БД, разве не так?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
07.05.2012, 12:23
Love_and_Peace, Сама по себе потребность использовать htmlspecialchars() - это лишь следствие того, что данные выводятся в виде html-страницы. Если бы они выдавались, например, в JSON'е, то вместо htmlspecialchars() была бы другая функция. Если бы данные выводились в виде тупо-текста, например, в примитивную консоль, то тут, пожалуй, не было бы никакой функции преобразования. Суть в том, что надо понимать разницу между собственно данными и представлением этих данных в каком-либо контексте.

Если все операции односторонние и проводятся единожды (один раз написал пост, он внесся в БД один раз, раз и навсегда, и больше с ним ничего сделать нельзя, кроме удаления), то нет никакой разницы, в какой момент времени применять htmlspecialchars() - до внесения в БД или после.
А если же предполагается еще и редактирование существующих постов, то что мы вообще будем редактировать, если у нас не будет оригинала?
1
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
07.05.2012, 13:51  [ТС]
Цитата Сообщение от Vovan-VE Посмотреть сообщение
Если все операции односторонние и проводятся единожды (один раз написал пост, он внесся в БД один раз, раз и навсегда, и больше с ним ничего сделать нельзя, кроме удаления), то нет никакой разницы, в какой момент времени применять htmlspecialchars() - до внесения в БД или после.
ну к примеру у меня, данные попадают в БД и редактировать их можно только в админке.
Данные, которые заносятся в БД - это обычный текст, со все возможными символами (!,",',#,№... и т.п.). Стоит ли в таком случае использовать ф-ю htmlspecialchars?
Просто если не использовать, вдруг какой-то редиска пропишет в форму вредоносный js-код, к примеру, будет ли мне от этого вред, если я буду использовать htmlspecialchars тока при выходе?
0
 Аватар для boong
154 / 124 / 11
Регистрация: 11.01.2010
Сообщений: 434
07.05.2012, 14:27
Приветствую, Vovan-VE говорит верно лучше всего хранить оригинал, но замете есть ряд неприятных моментов в оригинале которые нужно пресечь даже при выводе в input или textarea например: тря-ля-ля тут куча текста и в конце "/><script>alert('xss');</script> в теге input
HTML5
1
<input type="text"  name="text" value="тря-ля-ля тут куча текста и в конце"/><script>alert('xss');</script>"/>
только при пресечении этих моментов вывод станет безопасным))
1
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
07.05.2012, 19:17
Love_and_Peace, Если в БД уже вносится оригинальный текст, то htmlspecialchars() мы в любом случае должны использовать при выводе текста в html-страницу, как если бы использовали json_encode() для преобразования PHP-массива в код JSON.
1
 Аватар для __PION__
960 / 801 / 85
Регистрация: 21.07.2010
Сообщений: 3,522
07.05.2012, 19:44  [ТС]
да, это понятно. а как поступить в случае, который описал boong?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
07.05.2012, 19:51
Love_and_Peace, Да точно так же. У нас на входе text/plain, а на выходе text/html. Значит в любом случае применем htmlspecialchats().
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.05.2012, 19:51
Помогаю со студенческими работами здесь

Правильное сохранение родителя и ребенка тэга
Всем привет! Пишу свой html-парсер. Столкнулся с проблемой правильного сохранения указателя на родительский и дочерний тэг. В...

[JSON] Правильное сохранение настроек в Json файл
Добрый день уважаемые участники. Есть вопрос. Решил я сохранять настройки проги в json файл. Начну с начала.. Есть Класс

Правильное swprintf, правильное wprintf ?
Вродеж бы по ,,инструкции,,.... ..... wchar_t str = L&quot;tanya&quot;; // обозначает, что строка не однобайтная, а двуб ...

Экранирование кавычек
День добрый. Как правильно заэкранировать переменную rand, в нижеуказанном примере: &lt;script type='text/javascript'&gt; var...

Не хватает кавычек
Хочу выводить форму при получении гет запроса. С условием всё понятно, а как быть с выводом? в первой строке форма используются и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru