|
|
|
| слушайте!
после преобразования данных с помощью функции htmlspecialchars() если со следующей страницы вернуться назад (например для редактирования) то там всё оказывается в преобразованном виде. как можно этого избежать? | |
|
|
|
|
|
|
|
для: kb_nn
(16.05.2008 в 16:34)
| | Не понятно. Имеется в виду в HTML-форме или на HTML-странице? Возвращаетесь по ссылке или кнопкой браузера "Назад"? | |
|
|
|
|
|
|
|
для: cheops
(16.05.2008 в 17:14)
| | после отправки формы я попадаю на страницу предварительный просмотр ( например).
если при этом я нажимаю кнопку 'назад', то там в форме все совершенно не в том виде, в котором было введено. (разуммеется, только в случае, если были введены какие-нибудь спец. символы). | |
|
|
|
|
|
|
|
для: kb_nn
(16.05.2008 в 16:34)
| | htmlspecialchars_decode() | |
|
|
|
|
|
|
|
для: mihdan
(16.05.2008 в 18:22)
| | но тогда эффект от htmlspecialchars пропадет.
я пишу так:
<input name=name1 value='<? = htmlspecialchars(stripslashes(name1));?>'>
|
и всякий раз, когда я возвращаюсь на эту страницу. всё оказывается испорченным в этом поле. | |
|
|
|
|
|
|
|
для: kb_nn
(19.05.2008 в 10:12)
| | Не понятно зачем вы это делаете, и как возвращаетесь? | |
|
|
|
|
|
|
|
для: sim5
(19.05.2008 в 10:40)
| | чтобы предотвратить инъекцию.
браузером с помощью кнопки "назад."
javascript:history.back()
если снова делать ссылку на ту страницу, можно и преобразовать обратно.
а если кто-нибудь попробует веруться назад браузером: | |
|
|
|
|
|
|
|
для: kb_nn
(19.05.2008 в 10:55)
| | кто-нибудь | |
|
|
|
|
|
|
|
для: kb_nn
(19.05.2008 в 10:55)
| | "Лечить" надо перед записью в базу. Если вы разрешаете использование тегов в сообщении, то при записи в базу можете обработать их, если нет, то просто удаляйте их, сообщая пользователю о недоступности такого ввода. Иначе, пока идет ввод в форму, ее проверка, не надо никаких преобразований, вы ведь не запускать будете то, что получаете из формы. | |
|
|
|
|
|
|
|
для: sim5
(19.05.2008 в 14:34)
| | ну там это само собой.
хм.
а здесь, что , совсем не надо?
я везде встречал именно такое значение полей.
видимо я перестарался.
спасибо большое!!! | |
|
|
|
|
|
|
|
для: kb_nn
(19.05.2008 в 14:45)
| | Вы можете записать в базу следующее, например:
<script>
alert("This Trojan");
</script>
И ничего страшного не произойдет, только, если вам будет нужен этот код на исполнение, то так его и выводите из базы, а если на отображение как текста кода, то перед выводом на страницу, применяйте к этим данным из бызы htmlspecialchars().
Другое дело, если некоторое поле полученной формы служит для обращения, например, к ID-записи в базе, то к этому полю обязательно надо применить, например intval(), либо вырезать из этого значения все "опасное". Вот где может быть инъекция. | |
|
|
|
|
|
|
|
для: sim5
(19.05.2008 в 14:54)
| | большое спасибо. | |
|
|
|
|
|
|
|
для: kb_nn
(19.05.2008 в 14:57)
| | всё-таки
а если при записи
<input name=name1 value='<? = $name1;?>'>
в это поле будет введено нечто вроде
'><script>....</script><' | |
|
|
|
|
|
|
|
для: kb_nn
(06.06.2008 в 16:33)
| | И что? Если говорить другими словами, то в базе вы можете хранить как "чистые помыслы", так "откровенный разврат". Опасаться надо не помещения чего-то в поля таблицы, а опасных запросов к ней! И если ваш "откровенный разврат", это ваш "исполняемый разврат", то он выполянется под вашим контролем, но если это "разврат для показа публике", то "одеваейте" его в htmlspecialchars(). | |
|
|
|
|
|
|
|
для: sim5
(06.06.2008 в 16:54)
| | хм.
например в книге 'PHP 5 на примерах' такой код назван небезопасным.
и в качестве возможной атаки приведено '><script>.....</script><'
не такой код без последующей проверки, а именно такой код. | |
|
|
|
|
|
|
|
для: kb_nn
(06.06.2008 в 17:34)
| | Допустим, вы в поле ввода получаете такое содержимое:
<script>document.write("Как страшно жить!");</script>
|
Получая это, вы должны знать - для какой операции с базой данных это поле служит, если для запроса к базе (но тут не JS страшна, а несколько другое) - ТРЕВОГА и не пропускать, если для записи в поле таблицы, например, `code` - ну и пожалуйста, какие проблемы?
При выводе данных из поля `code` - если это исполняемый на странице код, так и выводим (а пусть боятся:)), а если это для "почитать", то htmlspecialchars(get `code`).
Что вас пугает? | |
|
|
|
|
|
|
|
для: kb_nn
(19.05.2008 в 14:45)
| | >а здесь, что , совсем не надо?
>я везде встречал именно такое значение полей.
Здесь - в значении атрибута value тега input - как раз более чем уместно.
Но похоже, htmlspecialchars у Вас вызывается не только здесь, но и при обработке входных данных.
А вот там оно неуместно совершенно. | |
|
|
|
|
|
|
|
для: kb_nn
(19.05.2008 в 10:12)
| | Функцию htmlspecialchars() ты должен расположить в обработчике-другом файле и проблема решится
value='<? = htmlspecialchars(stripslashes(name1));?>'>- и здесь не понял - что за знак = и name1
и фун-я stripslashes -здесь не уместна ))) | |
|
|
|
|
|
|
|
для: mihdan
(16.05.2008 в 18:22)
| | > mihdan (16.05.2008 в 18:22)
> htmlspecialchars_decode()
Что лучше - сломать и починить или просто не трогать? Вы, очевидно, идёте первым путём :( | |
|
|
|
|
|
|
|
для: BinLaden
(06.06.2008 в 19:05)
| | BinLaden, это был один из вариантов решения, что вы так взъелись??? | |
|
|
|
|
|
|
|
для: mihdan
(07.06.2008 в 00:46)
| | Не въезлся я, не волнуйтесь. Для Вашего уровня очень странное решение. Профессионалы должны быть более аккуратными перед новичками в советах. | |
|
|
|
|
|
|
|
для: 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']);
?>
|
Чувствовать нужно себя хозяином у себя дома, знать, что для чего предназначено, и применять необходимую тактику обороны там, где она требуется, а не обременять себя излишними крайностями. | |
|
|
|