[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Кавычки
Oracool
Есть текстовое поле:
<input type="text" name="firstname" />
Посетитель сайта может ввести в него следующие комбинации (что иногда и происходит):

"Abcdefgh"
Abcd'efgh
Abcd`efgh
Abcd 20\12 efgh
Abcd 20/12 efgh

Одним словом POST-ом может придти любое вот такое "имя". Так вот всё бы ничего, вырезать бы это всё к черту, но в базе нужно держать все эти кавычки и слэши. Потому что данные используются в формировании серьезных документов и все кавычки и слэши должны быть сохранены при выводе. Если человек ввел O'Reilly так и в документ (в данном случае это pdf? ну а не важно) должно попасть O'Reilly и никак иначе. Так же обстоит дело и со слэшами, т.к. это могут быть дом-дробь-корпус.

Посему вопрос. Какую последовательность действий по обработке переменной POST нужно сделать чтобы всё было тип-топ?



Спустя 16 минут, 10 секунд (7.06.2011 - 15:13) Renden написал(а):
Oracool
Ну так в базу заносить я думаю можно допустим даже в ХТМЛ сущностях типа htmlspecialchars которая какраз решит проблему с ковычками, а из базы пользователю ничего не мешает выводить через фунцию htmlspecialchars_decode

Спустя 7 минут, 33 секунды (7.06.2011 - 15:21) Oracool написал(а):
Цитата (Renden @ 7.06.2011 - 12:13)
Oracool
Ну так в базу заносить я думаю можно допустим даже в ХТМЛ сущностях типа htmlspecialchars которая какраз решит проблему с ковычками, а из базы пользователю ничего не мешает выводить через фунцию htmlspecialchars_decode

Ну и какая HTML-сущность у прямого или обратного слэша? В том то и вопрос ...

Спустя 6 минут, 32 секунды (7.06.2011 - 15:27) Renden написал(а):
Oracool
addslashes() тебе в помощь)

Спустя 24 минуты, 56 секунд (7.06.2011 - 15:52) Oracool написал(а):
Ну вообщем поразмыслив, для себя решил пока так:

$var = preg_replace("/\`/", "'", $var); [`] меняет на [']
$var = preg_replace("/\'/", "'", $var); ['] туда же
$var = preg_replace("/\"/", """, $var); понятно
$var = preg_replace("/\\\/", "& # 8260 ;", $var); [\] меняем на [⁄]
$var = preg_replace("/\//", "& # 8260 ;", $var); [/] туда же...

В базу записываются коды, т.е. как нужно. И из базы на страницу выводятся уже как символы. Я правда не понял почему не приходится делать обратного преобразования!?

В php.ini и на локале и на сервере:
magic_quotes_gpc = Off
magic_quotes_runtime = Off
magic_quotes_sybase = Off

Следующий вопросы.
1. Правильный ли вектор у моих мыслей, учитывая выше расписанное?
2. Достаточно ли этого подхода чтобы защититься от кул-хацкеров, конкретнее от sql-инъекций?

Спустя 31 минута, 34 секунды (7.06.2011 - 16:24) killer8080 написал(а):
Oracool
ничего этого ненужно, просто обрабатывайте данные mysql_real_escape_string() перед вводом в БД, и всё будет путём smile.gif

Спустя 5 минут, 48 секунд (7.06.2011 - 16:29) Oracool написал(а):
Цитата (killer8080 @ 7.06.2011 - 13:24)
Oracool
ничего этого ненужно, просто обрабатывайте данные mysql_real_escape_string() перед вводом в БД, и всё будет путём smile.gif

Ну хорошо:
Написал O'Reilly и в базу встало O\'Reilly
При извлечении из бд stripslashes и получается O'Reilly здорово!
А что если человек напишет: 20\12 ? В бд попадет 20\\12, потом stripslashes мне всё испортит, потому что явит 2012. И чё?!

Спустя 1 минута, 59 секунд (7.06.2011 - 16:31) Oracool написал(а):
Пока что лучше не придумал:

$pattern = array("/\`/", "/\'/", "/\"/", "/\\\/", "/\//");
$replace = array("& # 39;", "& # 39;", "& # 34;", "& # 8260;", "& # 8260;");
$b = preg_replace($pattern, $replace, $b);

Разрывы специально поставил, а то форум умный :-)

Вопрос всё еще в силе.

Спустя 7 минут, 36 секунд (7.06.2011 - 16:39) killer8080 написал(а):
Цитата (Oracool @ 7.06.2011 - 16:29)
Написал O'Reilly и в базу встало O\'Reilly

В базу вставится O'Reilly !
Экранирование нужно для запроса, чтобы БД отличала служебные символы от данных, а в базу экранирующие слеши не попадут.
Но при выводе из базы в html все юзерские данные нужно прогонять через htmlspecialchars() обязательно! Иначе это будет XSS уязвимость!

Спустя 15 часов, 23 минуты, 28 секунд (8.06.2011 - 08:02) Oracool написал(а):
Цитата (killer8080 @ 7.06.2011 - 13:39)
Цитата (Oracool @ 7.06.2011 - 16:29)
Написал O'Reilly и в базу встало O\'Reilly

В базу вставится O'Reilly !
Экранирование нужно для запроса, чтобы БД отличала служебные символы от данных, а в базу экранирующие слеши не попадут.
Но при выводе из базы в html все юзерские данные нужно прогонять через htmlspecialchars() обязательно! Иначе это будет XSS уязвимость!

Полез проверить и правда, верны слова твои :-)
Вот только одно "но" все же есть. Если брать всё ту же несчастную O'Reilly (не знаю что это я такое слово выбрал), то при выводе его просто на страницу всё хорошо, а вот если его выводить в поле формы, а именно сюда:
<input type="text" name="xxx" value="ВОТ_СЮДА_ВОТ" />
то вылезает глюкозавр:
<input type="text" name="xxx" value="O" reilly'="" />

Покопавшись в мануалах понял что перед выводом, что на страницу, что в форму, нужно вызывать htmlspecialchars() с ключом 'ENT_QUOTES'
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.