Вернуться   Дизайнерский форум » ВЕБ-ПРОГРАММИРОВАНИЕ » HTML, CSS, JavaScript

Как вы обходите кавычки?

Обсуждение темы Как вы обходите кавычки? в разделе HTML, CSS, JavaScript, часть категории ВЕБ-ПРОГРАММИРОВАНИЕ; Юзер ввел даные в форму. В базу я записал mysql_escape_string($val); Потом на странице редактирования у меня Код: <input type="text" name="name" value="<?=stripslashes($name)?>" /> Но ...


Закрытая тема
 
Опции темы
Старый 03.05.2010, 11:49   #1
Юзер ввел даные в форму. В базу я записал mysql_escape_string($val);
Потом на странице редактирования у меня
Код:
<input type="text" name="name" value="<?=stripslashes($name)?>" />
Но только если в переменной $name будут кавычки, то первая получиться закрывающей для велью, а весь текст далее вне велью. Как обходить это? С одинарными кавычками тоже самое....
 
Старый 03.05.2010, 11:49
Ссылки
Старый 03.05.2010, 11:53   #2
" и '
 
Старый 03.05.2010, 12:05   #3
PHP код:
<input type="text" name="name" value="<?=htmlspecialchars(stripslashes($name))?>" />
Это раз.
Два - а кто вам сказал, что слэши надо снимать?
Вообщет для начала нужно проверить значение magic_quotes_gps... И только если оно установлено, тогда сию функцию и применять.
 
Старый 03.05.2010, 12:08   #4
Асмодиан, а такое различие кавычек, что я привел, приемлемо?
 
Старый 03.05.2010, 12:15   #5
Niemans, не понял тебя.
 
Старый 03.05.2010, 12:17   #6
Ну чтобы отличие было, одинарные и двойные использовать.
 
Старый 03.05.2010, 12:26   #7
Niemans, понимаешь в чём проблемма: это же тот текст, который ввёл пользователь. Но он же мог текст ввести, в котором есть и одинарные и двойные кавычки. И в любом случае html код должен быть корректен.
htmlspecialchars именно для этого и предназначен. Он преобразует проблемные символы в html коды (&quot; например)
 
2 пользователя(ей) сказали cпасибо:
BleSSeD (05.05.2010), Niemans (03.05.2010)
Старый 03.05.2010, 15:54   #8
htmlspecialchars я делаю перед записью в базу. Но оно мне так и выводит &quot;
 
Старый 03.05.2010, 19:07   #9
BleSSeD, эмммм... оригинальная логика.
Только вы бы перед тем, как возражать, попробовали бы сделать так, как я предложил. А вообще на будущее рассказываю свод правил о строковых преобразованиях в php.

№1. Из формы в php.
На самом деле наиболее правильно в php хранить строку в "нормальном" виде. То есть без лишних слешей, специальных (html/xml) последовательностей и прочей эквилибристики. Но вот информация, пришедшая к нам из формы зачастую содержит ЛИШНЕЕ - и виной тому дурацкая директива php magic_quotes.
Она добавляет лишние слэши перед всеми кавычками. Зачем она это делает - об этом позже. Так что по-хорошему нужно от этих слэшей избавиться. НО эта директива может быть и убрана, при этом стандартная очистка может поубивать все слэши из введённого пользователем текста.
Посему юзаем следующую конструкцию:
PHP код:
$value get_magic_quotes_gpc() ? stripslashes($value) : $value
Изначально в $value - у нас то, что получено из формы через $_GET или $_POST.
Вот это конструкция гарантирует нам, что результатом будет чистый текст без всяких добавок.

№2 Из php в форму
Довольно просто вставлять тексты в какие-нибудь дивы. Ну что - просто
PHP код:
<div><?=$value?></div>
Но вот что будет, если это $value - введённый пользователем текст? Ну вот взял я да ввёл в формочке "</div>"
Получили невалидную вёрстку. А ведь я могу пойти и дальше, написав так:
"<script>злой_троян</script>"
Да и очень часто нам нужно не внуть блока текст выводить, а внутрь аттрибута. Ну вот пример топикстартера довольно востребован. То есть мы пишем введённый текст в атрибут. А тут уж не только html-тэги нам будут мешать жить, но и обычные кавычки. Решается это всё одной лишь функцией php:
PHP код:
htmlspecialchars 
Вот она нам переведёт все символы, не разрешённые в качестве xml-текста в xml замены.
То есть пользователь нам ввёл:
<a href="mysite.ru"/>
А после этой функции код стал:
&lt;a href=&quot;mysite.ru&quot;/&gt;
Если этот текст запихнуть в value, получиться так:
<input type="text" name="name" value="&lt;a href=&quot;mysite.ru&quot;/&gt;" />
И у нас на формочке появиться поле ввода, в котором вбит текст:
<a href="mysite.ru"/>
То есть то, что нам и надо.

№3 Из php в MySQL
А теперь вернёмся к нашему magic_quotes - для чего это вообще было сделано.
Сама эта конструкция была добавлена в php для упрощения работы с базами данных.
Ведь как мы пишем комманды на SQL
$cmdtext = "INSERT INTO `mytable` (`id`, `name`) VALUES ({$id}, '{$name}')";
То есть: перед тем, как команда попадёт в само ядро MySQL, php вместо {$id} и {$name} вставит конкретные значения. И получиться так:

INSERT INTO `mytable` (`id`, `name`) VALUES (1, 'Вася')

Отлично. Но если наш юзер больной на весь вконтакте, то он может ввести в поле формы "имя" и следующее: "Василий 'Пупок' Пупочкин"
И что мы получим в SQL комманде?

INSERT INTO `mytable` (`id`, `name`) VALUES (1, 'Василий 'Пупок' Пупочкин')

Ага - заметили, что на "пупок" оказался ВНЕ строковой константы, и команда INSERT не пройдёт.
А если наш пупкин ещё и хакер, то он мог ввести и следующий прикол:
"some'); DROP TABLE `mytable`; SELECT ('"
Ну и результатом такой вот операции у нас будет убитая таблица mytable. Здорово?

В случае с формами, мы использовали замену символов ' и " на из html-последовательности, но в SQL это делать не слишком правильно, так как тем самым мы можем сильно навредить поиску по сайту и прочим операциям SQL. Решение для SQL другое - это энкейпс-последовательности. Суть проста - использование слеша. Если вы знаете php, то наверняка такими последовательносями пользовались сами.
PHP код:
echo "<input name=\"email\"/>"// Знакомо - это и есть те самые эскейпы. 
Ну и так вот - если каждый используемый нами слэш заэскейпить, то никакого дробления SQL комманды не будет, и всё пройдёт как надо.
Остаётся лишь выбрать: довериться готовому magic_quotes и материться, почему ваша чудная прога не работает на другом хостинге, или использовать специально сделанную для данного использования функцию
PHP код:
mysql_real_escape_string 
Которая, кстати, может преобразовать в допустимый для SQL формат ЛЮБУЮ строку, включая бинарную.

№4 из MySQL в php
А вот тут ничего делать не надо - функции mysql выдают на выход полностью правильную строку.

Как резюме:
Разумеется, всегда можно плюнуть на использование правильных функций и делать всё так, чтоб работало.
Например htmlspecialchars можно использовать для преобразования текста перед вводом в mySQL. Но вот получите вы обратно из sql эту строку и решите, что вам для чего-то панадобилась её подстрока из 20 первых символов (ну чё далеко ходить - в ячейку таблицы больше не влезает)... И получиться у вас прикольное поведение, что вместо точных 20, все строки будут разной длины, полностью невалидная вёрстка (из-за всяких &qo</td>) и куча прочих мелких сюрпризов
 
Этот пользователь сказал спасибо Асмодиан за это полезное сообщение:
BleSSeD (05.05.2010)
Старый 07.05.2010, 13:59   #10
http://blessed.te.ua/test.php
Код:
Код:
<?php
$str = "Hello, ' a";
?>
<input type="text" value='<?=htmlspecialchars($str)?>' />
И все равно глюк
 
Старый 07.05.2010, 13:59
Закрытая тема





Текущее время: 00:42. Часовой пояс GMT +4.

Реклама на форуме Условия размещения рекламы
Биржа ссылок Заработай на сайте!
Дизайнерский форум