Перейти к содержимому

Фото
- - - - -

PHP/mysql, небольшая проблема


  • Вы не можете создать новую тему
  • Please log in to reply
14 ответов в этой теме

#1 simonsays

simonsays
  • Пользователь
  • 835 сообщений

Отправлено 11 Сентябрь 2007 - 17:56

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

function securityConvert ($input){
	if (get_magic_quotes_gpc()) {
	$input = htmlspecialchars(mysql_real_escape_string(stripslashes(trim($input))));
			}
		else {
		$input = htmlspecialchars(mysql_real_escape_string(trim($input)));
			}
	return $input;
	}

Проблема в том, что при считывании этих текстов с базы данных текст нужно прогонять через функцию html_entity_decode(), иначе не отображаются эстовские символы.
Наверное решение простое, но я окончательно запутался... Как сделать так, чтобы отображались символы древних эстов, но конвертировались все теги?
  • 0

#2 Vladson

Vladson

    XTGamers.com

  • Постоялец
  • 1 921 сообщений
  • Откуда:Эстония, Таллинн

Отправлено 11 Сентябрь 2007 - 18:12

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

Что-то у тебя не правильно с кодировками.

Совет:
Если у тебя требуется поддержка и русского и эстонского текста то переводи всю систему на UTF-8 иначе замучаешься. (рано или поздно переходить придётся, но лучше рано чем поздно, потом будет сложнее)
  • 0
Один Владсон может за...ать всех, кроме себя самого. Два Владсона могли бы за...ать абсолютно кого угодно, но Владсон единственный и неповторимый. ©Vladson

Вы либо способны перелопатить тонны информации и отсеять лишнее, либо программистом не будете. ©Psih

Не вазелин, а бизнес-гель ©Avagraen

#3 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 11 Сентябрь 2007 - 21:39

simonsays, зачем ты кладёшь в базу htmlspecialchars текст? Не делай этого и будет тебе счастье (потом при отображении уже сделаешь) и не потребуется делать html_entity_decode.

Хотя, если эстонские буквы передаются тебе кодами, то htmlspecialchars их попортит в любом случае...

Как варинт (временная заглушка) пробегись потом по строке ф-ей str_replace и замени все испорченные эстонские буквы на нормальные (без &)
  • 0

#4 .NET

.NET
  • Постоялец
  • 3 511 сообщений

Отправлено 11 Сентябрь 2007 - 21:52

simonsays, http://phpfaq.ru/slashes читаем )
  • 0

#5 simonsays

simonsays
  • Пользователь
  • 835 сообщений

Отправлено 11 Сентябрь 2007 - 22:56

Как варинт (временная заглушка) пробегись потом по строке ф-ей str_replace и замени все испорченные эстонские буквы на нормальные (без &)

хорошее решение, спасибо!
только что ты имеешь ввиду по временной заглушкой? временный вариант?
  • 0

#6 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 12 Сентябрь 2007 - 15:15

только что ты имеешь ввиду по временной заглушкой? временный вариант?

Да, быстрое исправление бага "на коленке". Можно конечно так это дело и оставить, всё равно ни кто не узнает :)
  • 0

#7 simonsays

simonsays
  • Пользователь
  • 835 сообщений

Отправлено 13 Сентябрь 2007 - 11:32

Можно конечно так это дело и оставить, всё равно ни кто не узнает

:)
  • 0

#8 Suicider

Suicider
  • Пользователь
  • 149 сообщений

Отправлено 14 Сентябрь 2007 - 13:03

Не хочу новую тему создавать, напишу тут.
Вообщем 2 вопроса.
Какое сравнение/кодировку ставить в базе данных utf8_bin или utf8_unicode_ci или другой какой-то уникод? разница есть между ними?
и второй вопросик. никогда не понимал почему иногда происходит такая фигня. Все работает нормально и вдруг вылетает такая ошибка: Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /ххххх/efd992013ab35bf26ad6d00912af6cc1ad8b31dd.php:1) in /хххх/include/session.php on line 44.
Как с ней бороться? хеадеры я нигде не менял и вообще эту часть не трогал. Единственно я некоторые файлы пхп перевел в утф8. Решил перейти чисто на утф8. В чем может быть проблема?
  • 0

#9 Vladson

Vladson

    XTGamers.com

  • Постоялец
  • 1 921 сообщений
  • Откуда:Эстония, Таллинн

Отправлено 14 Сентябрь 2007 - 13:21

Xtops, проблема в BOM (РНР файлы должны быть в UTF8 без BOM)
  • 0
Один Владсон может за...ать всех, кроме себя самого. Два Владсона могли бы за...ать абсолютно кого угодно, но Владсон единственный и неповторимый. ©Vladson

Вы либо способны перелопатить тонны информации и отсеять лишнее, либо программистом не будете. ©Psih

Не вазелин, а бизнес-гель ©Avagraen

#10 Suicider

Suicider
  • Пользователь
  • 149 сообщений

Отправлено 14 Сентябрь 2007 - 13:23

спасибо. сейчас попробую

Сообщение изменено: Xtops (14 Сентябрь 2007 - 13:27 )

  • 0

#11 Voland

Voland
  • Пользователь
  • 272 сообщений

Отправлено 14 Сентябрь 2007 - 13:24

Если не ошибаюсь разница между utf8_bin и utf8_unicode_ci будет видна при сравнении строк.
В первом случае регистр имееет значение а во втором нет.

Смотри в /хххх/include/session.php on line 44.
Может там ты что-то выводиш через echo?
Вот сессия и не может хеадер послать.
  • 0

#12 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 14 Сентябрь 2007 - 13:25

1. Ставь кодировку utf8, а сравнение utf8_unicode_ci. Тут http://dev.mysql.com...icode-sets.html подробнее описаны его приемущества

2.Это случается из за того, что в начале файла ставится т.н. БОМ - символ обозначающий тип юникода (podrobnee: http://en.wikipedia....yte_Order_Mark). Чтобы ошибки не возникало, надо выбрать в текстовом редакторе тип сохранения без этого знака
  • 0

#13 Suicider

Suicider
  • Пользователь
  • 149 сообщений

Отправлено 14 Сентябрь 2007 - 13:38

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

Сообщение изменено: Xtops (14 Сентябрь 2007 - 13:50 )

  • 0

#14 Акей

Акей

    Смотрит свысока

  • Постоялец
  • 2 134 сообщений

Отправлено 14 Сентябрь 2007 - 15:00

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

"давайте отрежем удаву хвост! По самую голову"

Зачем добавлять в самое начало что-то? Заголовки ХТТП ответа посылаются тока ДО содержания страницы. А сессия ставит заголовок с куки и твой пробел ей мешает это сделать. В данном случает это никак с юникодом не связано. Если очень хочется вызывать заголовки и сессию гдето из середины кода, используй аутпут бафферинг
  • 0

#15 Setor

Setor
  • Постоялец
  • 1 890 сообщений
  • Откуда:Эстония, Таллин

Отправлено 14 Сентябрь 2007 - 15:07

Xtops, короче, в ошибке написано, что был произведён вывод клиенту перед открытием сессии, а т.к. во время открытия сессии клиенту отправляется Cookie (set_cookie()), никакого вывода быть не должно, пока не будут отправлены все куки! По этому в начале файла не должно быть никаких пробельных и непробельных символов, то же самое касается всяких инклудов, в общем, надеюсь, ты понял :)

А после вызова session_start() можешь делать сколько угодно пробелов ;) Если тебя такое положение дел не устраивает, есть возможность "лечения" делаешь кеширование вывода - ob_start() в самом начале скрипта и будет тебе счастье :)

Акей, ты меня опередил :) Бедный человек наверное, мало что поймёт из наших постов...
  • 0