Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: проблемы после прелобразования htmlspecialchars()
 
 автор: kb_nn   (16.05.2008 в 16:34)   письмо автору
 
 

слушайте!
после преобразования данных с помощью функции htmlspecialchars() если со следующей страницы вернуться назад (например для редактирования) то там всё оказывается в преобразованном виде. как можно этого избежать?

   
 
 автор: cheops   (16.05.2008 в 17:14)   письмо автору
 
   для: kb_nn   (16.05.2008 в 16:34)
 

Не понятно. Имеется в виду в HTML-форме или на HTML-странице? Возвращаетесь по ссылке или кнопкой браузера "Назад"?

   
 
 автор: kb_nn   (16.05.2008 в 17:22)   письмо автору
 
   для: cheops   (16.05.2008 в 17:14)
 

после отправки формы я попадаю на страницу предварительный просмотр ( например).
если при этом я нажимаю кнопку 'назад', то там в форме все совершенно не в том виде, в котором было введено. (разуммеется, только в случае, если были введены какие-нибудь спец. символы).

   
 
 автор: mihdan   (16.05.2008 в 18:22)   письмо автору
 
   для: kb_nn   (16.05.2008 в 16:34)
 

htmlspecialchars_decode()

   
 
 автор: kb_nn   (19.05.2008 в 10:12)   письмо автору
 
   для: mihdan   (16.05.2008 в 18:22)
 

но тогда эффект от htmlspecialchars пропадет.

я пишу так:
<input name=name1 value='<? htmlspecialchars(stripslashes(name1));?>'>

и всякий раз, когда я возвращаюсь на эту страницу. всё оказывается испорченным в этом поле.

   
 
 автор: sim5   (19.05.2008 в 10:40)   письмо автору
 
   для: kb_nn   (19.05.2008 в 10:12)
 

Не понятно зачем вы это делаете, и как возвращаетесь?

   
 
 автор: kb_nn   (19.05.2008 в 10:55)   письмо автору
 
   для: sim5   (19.05.2008 в 10:40)
 

чтобы предотвратить инъекцию.

браузером с помощью кнопки "назад."
javascript:history.back()

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

   
 
 автор: kb_nn   (19.05.2008 в 14:20)   письмо автору
 
   для: kb_nn   (19.05.2008 в 10:55)
 

кто-нибудь

   
 
 автор: sim5   (19.05.2008 в 14:34)   письмо автору
 
   для: kb_nn   (19.05.2008 в 10:55)
 

"Лечить" надо перед записью в базу. Если вы разрешаете использование тегов в сообщении, то при записи в базу можете обработать их, если нет, то просто удаляйте их, сообщая пользователю о недоступности такого ввода. Иначе, пока идет ввод в форму, ее проверка, не надо никаких преобразований, вы ведь не запускать будете то, что получаете из формы.

   
 
 автор: kb_nn   (19.05.2008 в 14:45)   письмо автору
 
   для: sim5   (19.05.2008 в 14:34)
 

ну там это само собой.

хм.
а здесь, что , совсем не надо?
я везде встречал именно такое значение полей.

видимо я перестарался.

спасибо большое!!!

   
 
 автор: sim5   (19.05.2008 в 14:54)   письмо автору
 
   для: kb_nn   (19.05.2008 в 14:45)
 

Вы можете записать в базу следующее, например:
<script>
alert("This Trojan");
</script>
И ничего страшного не произойдет, только, если вам будет нужен этот код на исполнение, то так его и выводите из базы, а если на отображение как текста кода, то перед выводом на страницу, применяйте к этим данным из бызы htmlspecialchars().
Другое дело, если некоторое поле полученной формы служит для обращения, например, к ID-записи в базе, то к этому полю обязательно надо применить, например intval(), либо вырезать из этого значения все "опасное". Вот где может быть инъекция.

   
 
 автор: kb_nn   (19.05.2008 в 14:57)   письмо автору
 
   для: sim5   (19.05.2008 в 14:54)
 

большое спасибо.

   
 
 автор: kb_nn   (06.06.2008 в 16:33)   письмо автору
 
   для: kb_nn   (19.05.2008 в 14:57)
 

всё-таки
а если при записи
<input name=name1 value='<? = $name1;?>'>

в это поле будет введено нечто вроде
'><script>....</script><'

   
 
 автор: sim5   (06.06.2008 в 16:54)   письмо автору
 
   для: kb_nn   (06.06.2008 в 16:33)
 

И что? Если говорить другими словами, то в базе вы можете хранить как "чистые помыслы", так "откровенный разврат". Опасаться надо не помещения чего-то в поля таблицы, а опасных запросов к ней! И если ваш "откровенный разврат", это ваш "исполняемый разврат", то он выполянется под вашим контролем, но если это "разврат для показа публике", то "одеваейте" его в htmlspecialchars().

   
 
 автор: kb_nn   (06.06.2008 в 17:34)   письмо автору
 
   для: sim5   (06.06.2008 в 16:54)
 

хм.

например в книге 'PHP 5 на примерах' такой код назван небезопасным.

и в качестве возможной атаки приведено '><script>.....</script><'

не такой код без последующей проверки, а именно такой код.

   
 
 автор: sim5   (06.06.2008 в 17:44)   письмо автору
 
   для: kb_nn   (06.06.2008 в 17:34)
 

Допустим, вы в поле ввода получаете такое содержимое:
<script>document.write("Как страшно жить!");</script>

Получая это, вы должны знать - для какой операции с базой данных это поле служит, если для запроса к базе (но тут не JS страшна, а несколько другое) - ТРЕВОГА и не пропускать, если для записи в поле таблицы, например, `code` - ну и пожалуйста, какие проблемы?
При выводе данных из поля `code` - если это исполняемый на странице код, так и выводим (а пусть боятся:)), а если это для "почитать", то htmlspecialchars(get `code`).
Что вас пугает?

   
 
 автор: Trianon   (06.06.2008 в 21:07)   письмо автору
 
   для: kb_nn   (19.05.2008 в 14:45)
 

>а здесь, что , совсем не надо?
>я везде встречал именно такое значение полей.

Здесь - в значении атрибута value тега input - как раз более чем уместно.
Но похоже, htmlspecialchars у Вас вызывается не только здесь, но и при обработке входных данных.
А вот там оно неуместно совершенно.

   
 
 автор: OLi   (06.06.2008 в 20:52)   письмо автору
 
   для: kb_nn   (19.05.2008 в 10:12)
 

Функцию htmlspecialchars() ты должен расположить в обработчике-другом файле и проблема решится
value='<? = htmlspecialchars(stripslashes(name1));?>'>- и здесь не понял - что за знак = и name1
и фун-я stripslashes -здесь не уместна )))

   
 
 автор: BinLaden   (06.06.2008 в 19:05)   письмо автору
 
   для: mihdan   (16.05.2008 в 18:22)
 

> mihdan (16.05.2008 в 18:22)
> htmlspecialchars_decode()

Что лучше - сломать и починить или просто не трогать? Вы, очевидно, идёте первым путём :(

   
 
 автор: mihdan   (07.06.2008 в 00:46)   письмо автору
 
   для: BinLaden   (06.06.2008 в 19:05)
 

BinLaden, это был один из вариантов решения, что вы так взъелись???

   
 
 автор: BinLaden   (07.06.2008 в 00:52)   письмо автору
 
   для: mihdan   (07.06.2008 в 00:46)
 

Не въезлся я, не волнуйтесь. Для Вашего уровня очень странное решение. Профессионалы должны быть более аккуратными перед новичками в советах.

   
 
 автор: sim5   (07.06.2008 в 09:30)   письмо автору
 
   для: mihdan   (07.06.2008 в 00:46)
 

to mihdan, вы не правы, это не вариант решения.

to kb_nn, ваша проблема в том, что вы не осознаете себя стратегом на своем поле боя. Не пользователи должны опредлять тактику вашей обороны, а вы. А это значит, что среди пользователей вы должны различать - кто вам "союзники", а кто "противники". А если вы стратег, то вам и "карты на руках", а карты говорят следующее...

Вы получаете информацию от своего агента из двух сообщений: name и text, и передана эта информация по скрытому секретному каналу POST. Но вы предполагаете, что возможен перехват этой информации, и вам могут подкинуть "дезу" или, что еще страшнее, "трояна" на поле боя. Но вам (как начальнику штаба) хорошо известно, что сообщение 'name' передается "пакетом" с кодовым наименованием <input type="text" maxlength="10">, и оно ограничено по длине, и будет служить ключом к сейфу командующего. Зная, что противник может перехватить это сообщение и запросто удалить из него maxlength="10", а также вам не хочется быть разжалованным до мл. лейтенанта и вместо тактики рыть окопы, вы, перед тем как вставить этот ключ в сейф, проверяте, что содержат эти данные:

<!-- полученные данные -->
<input type="text" name="name" value="<SCRIPT 
language="JavaScript">alert("Я ваш агент.");document.write("Это 
дислокация противника.");</SCRIPT>" />
<?
//ваш дешифровальщик проверяет сообщение
echo strpos($_POST['name'], 'script') ? "Вы не наш агент, Вы фулиган!" "Привет 007! Вы еще живы!?";
?>

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

<?
$secret 
htmlspecialchars($_POST['text']);
?>

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

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования