Sadda.ru Ironetcart Андроид Ассемблер MASM32 Linux Все статьи Table of Contents


 

Как я победил магические кавычки

  Макс Петров Март 2014

      Магические кавычки (magic_quotes) - опция PHP версий 4 и 5. В 6-ой версии магических кавычек уже нет, разработчики PHP сочли, что вред от магических кавычек превышает пользу от них. Польза состояла в защите баз данных от так называемых SQL-инъекций. В зримом воплощении магические кавычки - это палки (обратные слэши), появляющиеся перед одинарной кавычкой, двойной кавычкой, обратным слэшем, когда скрипт на сервере принял в массивы $_GET, $_POST, $_COOKIE переданный из браузера текст (в котором были эти символы).

      Передали на сервер: ' " \, получили на сервере: \' \" \\. Если передача текста из браузера на сервер (и назад) осуществлялась многократно (редактирование комментария на сайте), магические кавычки размножаются. Например, при трехкратной пересылке браузер-сервер-браузер текста ' " \ получим уже такое: \\\' \\\" \\\\.

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

      Предлагаемые в Интернете способы борьбы с магическими кавычками, состоящие в изменении настроек PHP, не подходят для нашей задачи по той причине, что не являются кросс-серверными. Доступ к настройкам PHP на ряде серверов может быть закрыт, а нам нужно решение, работающее везде и всегда. Простым, надежным, абсолютно кросс-серверным способом борьбы с магическими кавычками будет отправка формами скрытых полей с соответствующими значениями. Принимающий данные php-скрипт, по значениям этих скрытых полей, легко определит наличие в тексте сообщения лишних обратных слэшей. Вырезать же их, при обнаружении, не составит затруднений.

      Скрытые поля формы:

...
<input type=hidden name=mquotes1 value='"'>
<input type=hidden name=mquotes2 value="'">
<input type=hidden name=mquotes3 value="\">
...

      Обработчик в принимающем php-скрипте:

...
$message = $_POST["message"];		// принятый текст

if ( $_POST["mquotes1"] === chr(92).chr(34) ) {
	$message = str_replace(chr(92).chr(34), chr(34), $message);
}
if ( $_POST["mquotes2"] === chr(92).chr(39) ) {
	$message = str_replace(chr(92).chr(39), chr(39), $message);
}
if ( $_POST["mquotes3"] === chr(92).chr(92) ) {
	$message = str_replace(chr(92).chr(92), chr(92), $message);
}
...

      Шансов выжить у магических кавычек нет.



Ironetcart

      Техническая поддержка: http://ironburattin.ru
      Взять движок: Форум на файлах «Ironetcart» (скачать)

      Разработка форумного движка
      Форум «Железный Бураттин» (название и концепция)
      Статическая защита форм
      Идеальная капча
      Как я победил магические кавычки
      Внеклавиатурные символы HTML
      Хранимые XSS-атаки и защита от них (удаляем javascript из html в браузере)
      Защита визуального html-редактора (фильтрация HTML на стороне сервера)
      Скорость движка форума: файлы или база данных
      Прогресс-бар на PHP
      Зачем тупому форуму поиск?

     


© Max Petrov При использовании материалов ссылка на sadda.ru обязательна