|
|
|
| Не могу понять, почему из массива POST удаляются всё слово в "кавычках"?
<input name="zagolovok" type="text" class="pole" value="<?php echo @stripslashes($_POST['zagolovok']) ?>" size="60" maxlength="60">
|
Если в поле написать: монитор "samsung", то после обновления страницы в поле остаётся запись: монитор.
Пробовал убрать stripslashes (), но в этом случае остается запись: монитор \
А в этом поле, такого не происходит:
<textarea name="text_obyavl" cols="80" rows="5" class="pole" id="text_obyavl"><?php echo @stripslashes($_POST['text_obyavl']) ?></textarea>
|
| |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 19:25)
| | А вы в код страницы посмотрите в браузере? Что там написано?
<input name="zagolovok" type="text" class="pole" value="монитор "samsung"" size="60" maxlength="60">
| Верно?
Следовательно у вас value="монитор ", а дальше вообще HTML-ошибка Был бы у вас XHTML -выдал бы ошибку разбора.
Затем....
Раз стрипслэшез значит у вас включены magic_quotes. Их лучше вообще отключить. Они ток мешают и путают.
А код исправить так:
<input name="zagolovok" type="text" class="pole" value="<?php echo htmlspecialchars( $_POST['zagolovok'] , ENT_QUOTES ) ?>" size="60" maxlength="60">
| либо, если не отключите magic_quotes, то
<input name="zagolovok" type="text" class="pole" value="<?php echo htmlspecialchars( stripslashes($_POST['zagolovok']) , ENT_QUOTES ) ?>" size="60" maxlength="60">
|
| |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 19:25)
| | > А в этом поле, такого не происходит:
>
<textarea name="text_obyavl" cols="80" rows="5" class="pole" id="text_obyavl"><?php echo @stripslashes($_POST['text_obyavl']) ?></textarea>
|
А попробуйте в это поле введите не монитор "samsung", а <script>alert('Я ява-скрипт. Я работаю!');</script> и посмотрите что получится. | |
|
|
|
|
|
|
|
для: Sfinks
(14.05.2012 в 20:00)
| | Да конечно это не дело....
А это поможет избежать срабатывание скриптов в поле text_obyavl:
echo @htmlspecialchars( stripslashes($_POST['text_obyavl']) , ENT_QUOTES );
|
А можно ли значение value указывать в одиночных кавычках? | |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 20:28)
| | >А это поможет избежать срабатывание скриптов в поле text_obyavl:
Да. htmlspecialchars() для этого и нужен.
>А можно ли значение value указывать в одиночных кавычках?
Можно. Но к защите это не относится. Будете писать в одиночных, будут проблемы с одиночными. Все что ввел юзер и выводится в браузер нужно пропускать через htmlspecialchars(). | |
|
|
|
|
|
|
|
для: Sfinks
(14.05.2012 в 21:07)
| | Да, у меня перед занесением в базу данных все значения поле проходят через htmlspecialchars().
Но вот про то, что это же нужно делать при отображении значения POST в поле - я не догадался.
Но почему сейчас, при указании <script>alert('Я ява-скрипт. Я работаю!');</script> в поле text_obyavl образуется ошибка и все данные других полей вообще не заносятся в базу. | |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 21:20)
| | > Но почему сейчас, при указании <script>alert('Я ява-скрипт. Я работаю!');</script>
> в поле text_obyavl образуется ошибка и все данные других полей вообще не заносятся в базу.
именно потому что:
> у меня перед занесением в базу данных все значения поле проходят через htmlspecialchars().
|
перед занесением в БД нужно пропускать через mysql_real_escape_string(), а не htmlspecialchars() !!!
ОБЯЗАТЕЛЬНО!
Так как сейчас, у вас еще и SQL-инъекция возможна.
И все-таки разберитесь с magic_quotes. Включены они у вас или нет? И если включены - выключите. | |
|
|
|
|
|
|
|
для: Sfinks
(14.05.2012 в 21:28)
| | Т.е сейчас у меня перед занесением в базу выполняется обработка:
$text_obyavl = $_POST['text_obyavl']; $text_obyavl = trim($text_obyavl); $text_obyavl = stripslashes($text_obyavl); $text_obyavl = htmlspecialchars($text_obyavl);
|
А нужно сделать так:
$text_obyavl = $_POST['text_obyavl']; $text_obyavl = trim($text_obyavl); $text_obyavl = stripslashes($text_obyavl); $text_obyavl = mysql_real_escape_string($text_obyavl);
|
И безопасность обеспечена? | |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 21:36)
| | Если magic_quotes отключены, то $text_obyavl = stripslashes($text_obyavl); лишнее. А так да. | |
|
|
|
|
|
|
|
для: Sfinks
(14.05.2012 в 22:08)
| | А нужно ли после данной обработки mysql_real_escape_string(), при выводе из базы применять какие то обратные функции?
И кстати, при такой обработке:
$text_obyavl = $_POST['text_obyavl']; $text_obyavl = trim($text_obyavl); $text_obyavl = stripslashes($text_obyavl); $text_obyavl = mysql_real_escape_string($text_obyavl);
|
Если в поле указать код: <script>alert('Я ява-скрипт. Я работаю!');</script> то он сработает!
А так выдает ошибку, но за то не заносится в базу:
$text_obyavl = $_POST['text_obyavl']; $text_obyavl = trim($text_obyavl); $text_obyavl = stripslashes($text_obyavl); $text_obyavl = htmlspecialchars($text_obyavl);
|
Как быть ....?
Чтобы и не один код не выполнялся и SQL инъекции не заносились и ошибку не выдавало. | |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 22:10)
| | А что нельзя вместе использовать htmlspecialchars () и mysql_real_escape_string():
$text_obyavl = $_POST['text_obyavl']; $text_obyavl = trim($text_obyavl); $text_obyavl = stripslashes($text_obyavl);
$text_obyavl = htmlspecialchars($text_obyavl); $text_obyavl = mysql_real_escape_string($text_obyavl);
|
| |
|
|
|
|
|
|
|
для: sega_z
(14.05.2012 в 23:18)
| | Вы понимаете что делают эти функции? | |
|
|
|
|
|
|
|
для: Sfinks
(14.05.2012 в 23:38)
| | Думаю что, да.
Я просто, как вариант, хочу увеличить безопасность до максимума. | |
|
|
|
|
|
|
|
для: sega_z
(15.05.2012 в 00:03)
| | Думаю что не очень, все-таки. Увеличите вы геморрой и размер базы, а не безопасность.
Пример (по вашей цепочке):
<?php
// Пусть $_POST['text_obyavl'] = " & "
// внесение в БД
$text_obyavl = $_POST['text_obyavl']; // " & "
$text_obyavl = trim($text_obyavl); // "&"
$text_obyavl = stripslashes($text_obyavl); // "&"
$text_obyavl = htmlspecialchars($text_obyavl); // "&"
$text_obyavl = mysql_real_escape_string($text_obyavl); // "&"
put_to_bd($text_obyavl) // какая-то юзер-функция которая пишет текст в БД
|
Теперь допустим, что у вас в коде идет такая проверка - если данные введены из формы, то вывести $_POST, а если нет - то из БД.
Как выводить ваши данные?
<?php
if(!empty($_POST['text_obyavl'])){
echo htmlspecialchars(stripslashes($_POST['text_obyavl']));
}
else{
echo load_from_bd(); // какая-то юзер-функция которая выбирает текст из БД
}
|
Теперь тоже самое по-моему (с отключенными magic_quotes):
<?php
// внесение
put_to_bd( mysql_real_escape_string( trim( $_POST['text_obyavl'] ) ) );
// вывод
echo htmlspecialchars( !empty( $_POST['text_obyavl'] ) ? trim( $_POST['text_obyavl'] ) : load_from_bd() );
|
Кода меньше, в БД 1 байт вместо 5, а разницы в безопасности никакой.
Думайте сами, что вам лучше. | |
|
|
|
|
|
|
|
для: Sfinks
(15.05.2012 в 02:16)
| | Спасибо Вам, теперь все стало более понятней!
У меня к Вам дополнительный вопрос:
В каком порядке нужно обрабатывать переменную функциями htmlspecialchars(), nl2br() и mysql_real_escape_string () | |
|
|
|
|
|
|
|
для: sega_z
(15.05.2012 в 12:24)
| | Ничего вы не поняли. | |
|
|
|
|
|
|
|
для: confirm
(15.05.2012 в 12:25)
| | Вы считаете, что не к чему использование nl2br()? | |
|
|
|
|
|
|
|
для: sega_z
(15.05.2012 в 12:46)
| | Я лично считаю, что mysql_real_escape_string() - это прием гостей, а htmlspecialchars() - это уже провожая их домой, помочь им одеться, nl2br() - это закрыли за гостями двери. Если две последних и подразумевают обязательную последовательность, то первая тут при чем? Если же вы хотите держать гостей всегда одетыми, то это не лучшая идея. | |
|
|
|
|
|
|
|
для: confirm
(15.05.2012 в 12:51)
| | Я понял, что htmlspecialchars() лучше использовать на выходе из базы.
Но после обработки mysql_real_escape_string() код какого нибудь скрипта будет спокойно храниться в базе (зачем это надо).
После обработки htmlspecialchars() на выходе - в тексте будут отображаться HTML-сущности (тоже ничего хорошего).
А что nl2br() тоже выполняет какую то защитную функцию, помимо замены переносов строки на <br/>?
Целесообразно ли использовать strip_tags() вместе с mysql_real_escape_string(), а функцию htmlspecialchars() вообще убрать? | |
|
|
|
|
|
|
|
для: sega_z
(15.05.2012 в 13:04)
| | Если htmlspecialchars() для вас это всего лишь категория "хорошо" или "плохо", и для вас это плохо, не применяйте, выводите как есть, до первых неприятностей. Вот может после этого вы просто прочтете достаточное количество материалов касающихся веб безопасности, чтобы понять в конце концов, что это все значит и для чего.
А я не знаю как вам втолковать это. | |
|
|
|
|
|
|
|
для: confirm
(15.05.2012 в 13:17)
| | Нет, я понимаю степень важности htmlspecialchars().
Просто, как потом на выходе из базы, после обработки htmlspecialchars(), избавиться от HTML сущностей в тексте.
И все таки нужен ли тег strip_tags () до занесения в базу?
Прошу Вас, учитывайте пожалуйста то, что я на много тупее Вас в области WEB программирования. В данной ситуации Вы учитель, а я ученик. | |
|
|
|
|
|
|
|
для: sega_z
(15.05.2012 в 13:39)
| | Что делает функция htmlspecialchars()?
Чем занимается функция strip_tags ()?
Что означает "избавиться от HTML сущностей в тексте" и для чего?
И не называйте себя тупым, глупее других, просто задумывайтесь над тем, что изучаете, пробуйте. | |
|
|
|
|
|
|
|
для: confirm
(15.05.2012 в 13:45)
| | Насколько я понимаю, htmlspecialchars() - преобразует специальные символы, которые используются при создании HTML кода в HTML сущности.
Функция strip_tags () - удаляет все возможные HTML и PHP тэги.
А что HTML сущности при выводе из базы данных автоматически преобразуются обратно в символы?
Скажу Вам чесно, на вашем форуме я получаю гораздо больше знаний и узнаю много нового, чем за целый день проведенный в интернете. | |
|
|
|
|
|
|
|
для: sega_z
(15.05.2012 в 14:00)
| | >htmlspecialchars() - преобразует специальные символы - вы интересовались какие именно?
Это не мой форум. ) | |
|
|
|
|
|
|
|
для: confirm
(15.05.2012 в 14:13)
| | 1) & преобразуется в &
2) " преобразуется в "
3) ' преобразуется в '
4) < преобразуется в <
5) > преобразуется в >
Т.е. эта замена не дает сработать какому либо коду (скрипту), т.к. в нём используются эти символы.
Но strip_tags () вообще удаляет все теги, чем тогда эта функция хуже htmlspecialchars()?
Раньше я думал, что какой либо скрипт или код может сработать в базе данных и поэтому предпологал, что все опасные символы нужно менять до занесения в базу. | |
|
|
|
|
|
|
|
для: sega_z
(15.05.2012 в 14:19)
| | Видите - достаточно было поинтересоваться и пришло прозрение. Думаю вопрос "как избавиться от html сущностей на странице", к тому же, вы не их видите в итоге, а символ ими представленный.
strip_tags() не хуже и не лучше, но она не всегда может сработать корректно, об этом тоже можете прочесть в описании функции. В общем использовать ее надо с осторожностью.
Клиентские скрипты не могут даже на сервере выполниться, не говоря уж о базе данных. Вы можете обрабатывать данные перед занесением в базу данных функцией htmlspecialchars(), не запрещено, но это головная боль для вас же самих. Данные не только выводят из базы, но и бывает необходимость манипулировать ими, в этом случае данные уже обработанные функцией htmlspecialchars сплошная морока. | |
|
|
|
|
|
|
|
для: confirm
(15.05.2012 в 14:31)
| | Ну тогда я не совсем понимаю зачем вообще заменять переносы строк на <br/> функцией nl2br () перед занесением в базу. Зачем вообще она нужна? | |
|
|
|
|
|
|
|
для: sega_z
(15.05.2012 в 14:55)
| | А с чего вы взяли, что их надо заменять при внесении в базу, с чего такое утверждение? Если вам надо учитывать эти переносы на странице, значит при выводе заменяйте их на <br/>. А вот что сперва сделать - это, а потом htmlspecialchars, или наоборот, подумайте сами. | |
|
|
|
|
|
|
|
для: confirm
(15.05.2012 в 15:02)
| | Ну сначала нужно выполнить htmlspecialchars(), а затем nl2br().
А разве сохранятся переносы строк без обработки nl2br() при отображении данных на странице?
У меня опять возникает вопрос, а зачем вообще нужна эта функция nl2br(), если все переносы и без нее будут работать? | |
|
|
|
|
|
|
|
для: sega_z
(15.05.2012 в 15:09)
| | Переносы \r\n будут отображаться только в текстовых документах, а на html страницах игнорируются и будут отображаться одним пробелом. В html перенос, это тег <br>. | |
|
|
|
|
|
|
|
для: confirm
(15.05.2012 в 15:14)
| | Ну тогда не лучше ли обрабатывать nl2br() до занесения в базу?
Насколько я понимаю, минус только в том, что теги <br/> будут занимать место в базе. | |
|
|
|
|
|
|
|
для: sega_z
(15.05.2012 в 15:22)
| | Откуда вы взяли, что его надо обрабатывать nl2br() до занесения в базу?
Я вам уже говорил, что любое лишнее в базе это головная боль, как то htmlspecialchars. Тоже самое и <br/> в базе. Что с ним станет после htmlspecialchars? Хранить html код в базе не запрещено, и если не предполагается его модификация в дальнейшем, и он не содержит другого кода кроме вашего (разрешенного), а все остальное потенциально опасное обработано, то пожалуйста. | |
|
|
|
|
|
|
|
для: sega_z
(15.05.2012 в 15:22)
| | А потом вам потребуется сделать поик по сайту (по сообщениям форума).....
И как найти строку "молодая зеленая травка"?
Если пользовательнаписал ее в сообщении так , то в базе у вас будет "молодая<br/>зеленая<br/>травка".
А \r\n при поиске по регулярными выражениями можно учитывать на равне с пробелами. | |
|
|
|
|
|
|
|
для: Sfinks
(15.05.2012 в 15:33)
| | Да, на самом деле ни к чему...
Если я правильно понимаю, использование htmlspecialchars() до занесения в базу и выведение из базы вообще без всякой обработки, вообще не имеет смысла (в плане безопасности)? | |
|
|
|
|
|
|
|
для: sega_z
(15.05.2012 в 15:52)
| | >Если я правильно понимаю, использование htmlspecialchars() до занесения в базу и выведение из базы вообще без всякой обработки, вообще не имеет смысла (в плане безопасности)?
Я вам уже постов 20 назад это писал. Еще и с примером. После которого вы, кстати, сказали, что поняли. | |
|
|
|
|
|
|
|
для: Sfinks
(15.05.2012 в 17:59)
| | Я понял то, что htmlspecialchars() нужно обрабатывать при выводе из базы.
Просто у меня в данный момент, пока что такая ситуация и мне важно знать есть ли в ней смысл (чтобы "поблагодарить" человека, который мне это посоветовал).
Т.е.вообще бесполезная процедура, да??? | |
|
|
|
|
|
|
|
для: sega_z
(15.05.2012 в 18:07)
| | да | |
|
|
|
|
|
|
|
для: Sfinks
(15.05.2012 в 18:36)
| | Спасибо Вам за подробные консультации!
Я узнал очень много нового для меня.
Остался один не понятный мне вопрос.
Массивы POST, GET, SESSION, COOKIES тоже нужно обрабатывать htmlspecialchars() только на выходе? | |
|
|
|
|
|
|
|
для: sega_z
(15.05.2012 в 18:54)
| | SESSION - вы сами создаете. Юзер к нему доступа не имеет. Конечно при условии, что остальные дыры у вас закрыты.
Массивы POST, GET, COOKIES обрабатывать НЕ НУЖНО!
Обрабатывать нужно данные, которые вы используете из этих массивов.
Обрабатывать нужно соответственно применению.
Если вы $_POST['user'] выводите в браузер - htmlspecialchars().
Если вы $_GET['text'] сохраняете в БД - mysql_real_escape_string(). | |
|
|
|
|
|
|
|
для: Sfinks
(15.05.2012 в 19:16)
| | Супер! Мои знания пополнились!
Давайте на минуту представим, что htmlspecialchars() вообще не существует. Поможет ли безопасности обработка данных перед записью в базу следующая функция при условии что включены косые слеши перед кавычками:
$text = $_POST['text'];
$text = strip_tags($text);
$text = str_replace(array("&","<",">")," ","$text");
|
Если поможет, то и на выходе из базы не нужно применять htmlspecialchars().
P.S. Просто очень много страниц и очень много переменных, где сейчас данные из базы выводятся без обработки htmlspecialchars(). Даже представить не могу сколько времени уйдет на редактирование кода. Вот и ищу способ как обезопасить без использования htmlspecialchars(). | |
|
|
|
|
|
|
|
для: sega_z
(15.05.2012 в 19:21)
| | Перед записью в базу mysql_real_escape_string | |
|
|
|
|
|
|
|
для: mihdan
(18.05.2012 в 12:51)
| | Очень ценное замечание после того как тут об этом в каждой букве сказали. ) | |
|
|
|
|
|
|
|
для: confirm
(18.05.2012 в 12:56)
| | Я просто забыл в вышеуказанном примере указать mysql_real_escape_string:
$text = $_POST['text'];
$text = strip_tags($text);
$text = str_replace(array("&","<",">")," ","$text");
$text = mysql_real_escape_string($text);
|
Будет ли толк от этой конструкции, если на выходе из базы не использовать htmlspecialchars() ? | |
|
|
|
|
|
|
|
для: sega_z
(18.05.2012 в 13:26)
| | Мой вам совет, последний, переделайте свои скрипты, удалите весь мусор из базы, пока не поздно. Это гораздо рациональней будет, чем заниматься ерундой. | |
|
|
|
|
|
|
|
для: confirm
(18.05.2012 в 13:40)
| | В целом я понимаю, что так будет лучше.
Но Вы даже не представляете какой это будет объём работы (около 450 000 страниц + 33 000 записи в базе данных), времени категорически не хватает....
"Благодаря" "программисту", который мне 2 года назад посоветовал применять htmlspecialchars() до занесения в базу. | |
|
|
|
|
|
|
|
для: sega_z
(18.05.2012 в 14:09)
| | 33000 записей в базе, это же не руками перебирать, скрипт написать, а он быстро сделает. Тоже самое и в php скриптах, заменить код в них, это не так уж и много, по крайней мере их у вас не 450 000. Что за страницы количеством 450 000 мне трудно представить, если статические, то ужас, если динамические, то смотрите выше, и не называйте таких цифр. | |
|
|
|
|
|
|
|
для: confirm
(18.05.2012 в 14:22)
| | Простите один ноль лишний, я хотел написать 45 000.
Есть и статические и динамические страницы. Все страницы основного сайта по всей России + все страницы всех региональных поддоменов России + несколько десятков выборки из базы различных вариантов переменных на каждой странице. | |
|
|
|
|
|
|
|
для: sega_z
(18.05.2012 в 14:50)
| | В статических страницах, если есть что из мусора типа < " и т.п..., заменить - str_replace.
Динамические страницы готовит скрипт, и сколь бы вы нулей не убирали, у вас их никак не сотнями, не говоря уж о тысячах, так что поправить участи в коде можно. | |
|
|
|
|
|
|
|
для: confirm
(18.05.2012 в 15:07)
| | Нет я не преувеличиваю, в том числе одинаковые страницы, которые лежат в разных папках разных поддоменов с кучей всяких рубрик и подрубрик.
Ну короче, придется все таки найти время и заняться редактированием.
Спасибо за ценные советы! | |
|
|
|
|
|
|
|
для: sega_z
(18.05.2012 в 15:32)
| | Я только одного не могу понять..... Если такой большой сайт и по всей РФ, и с региональными поддоменами, и т.д. и.т.п..... И С ТАКИМИ ДЫРАМИ!!!
Как его до сих пор никто не поломал??? | |
|
|
|