Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: htmlspecialchars удаляет русские символы
 
 автор: Mookapek   (03.02.2015 в 23:48)   письмо автору
 
 

Такая ситуация:
обработчику отправляются данные из формы, в начале скрипта обрабатываю данные через функцию htmlspecialchars вот так $_POST['name'] = htmlspecialchars($_POST['name'])
Но вот только, если в name содержатся кириллические символы, то htmlspecialchars возвращает пустую строку. Как быть?
Что-то с кодировкой там, видимо.

  Ответить  
 
 автор: Mookapek   (03.02.2015 в 23:59)   письмо автору
 
   для: Mookapek   (03.02.2015 в 23:48)
 

Да, в кодировке дело.
Начиная с версии PHP 5.4 значение по умолчанию для параметра encoding функции htmlspecialchars было изменено на UTF-8. А у меня страницы были в Windows-1252.

  Ответить  
 
 автор: Sfinks   (04.02.2015 в 01:40)   письмо автору
 
   для: Mookapek   (03.02.2015 в 23:48)
 

> в начале скрипта обрабатываю данные через функцию htmlspecialchars
А зачем, если не секрет?

  Ответить  
 
 автор: Mookapek   (04.02.2015 в 02:58)   письмо автору
 
   для: Sfinks   (04.02.2015 в 01:40)
 

Против межсайтового скриптинга.

  Ответить  
 
 автор: Valick   (04.02.2015 в 07:12)   письмо автору
 
   для: Mookapek   (04.02.2015 в 02:58)
 

это надо делать непосредственно перед выводом в браузер
нечего htmlspecialchars делать в начале скрипта
об этом пишут на каждом форуме много лет подряд, да кто бы еще читал....

  Ответить  
 
 автор: Mookapek   (04.02.2015 в 17:55)   письмо автору
 
   для: Valick   (04.02.2015 в 07:12)
 

Ну вот у меня перед выводом в браузер и делается.

  Ответить  
 
 автор: confirm   (04.02.2015 в 18:17)   письмо автору
 
   для: Mookapek   (04.02.2015 в 17:55)
 

А тогда это зачем - $_POST['name'] = htmlspecialchars($_POST['name']) ?

  Ответить  
 
 автор: Mookapek   (04.02.2015 в 22:40)   письмо автору
 
   для: confirm   (04.02.2015 в 18:17)
 

В обработчике есть строка
echo $_POST['name']

  Ответить  
 
 автор: Sfinks   (05.02.2015 в 00:34)   письмо автору
 
   для: Mookapek   (04.02.2015 в 22:40)
 

Лучше обрабатывать именно при выводе:
<?php
  
echo htmlspecialchars($_POST['name']);

Либо, если одно и то же значение выводится несколько раз, то чтобы не обрабатывать многократно, присвоить результат обычной переменной:
<?php
  $name 
htmlspecialchars($_POST['name']);
  echo 
$name;

Но никак не:
> в начале скрипта обрабатываю данные через функцию htmlspecialchars
Потому что в таком случае, данные и в БД попадут обработанными. А в БД оно не нужно. Перед вставкой в БД нужно обрабатывать совсем другими функциями.
И даже если в данном конкретном примере у вас нет вставки в БД, все равно не нужно обрабатывать в начале скрипта. Потому что привыкнув обрабатывать так, а не правильно, в конце концов у вас где-то да закрадется ошибка, пусть даже в другом скрипте.

  Ответить  
 
 автор: Mookapek   (05.02.2015 в 00:40)   письмо автору
 
   для: Sfinks   (05.02.2015 в 00:34)
 

> Потому что в таком случае, данные и в БД попадут обработанными

Так я и хочу, чтобы и в БД они попали обработанные, без всяких зловредных скриптов. Ведь я потом эти же данные из БД вывожу в браузер. Так вот, чтобы всякий раз перед выводом переменной не протаскивать ее через htmlspecialchars, я фильтрую её один раз непосредственно после получения из формы.

  Ответить  
 
 автор: Sfinks   (05.02.2015 в 02:18)   письмо автору
 
   для: Mookapek   (05.02.2015 в 00:40)
 

Хотеть можно все что угодно. А правильно в данной ситуации так, как вам тут все говорят. В бд надо не скриптов бояться, а sql-инъекций. Ладно, не хотите слышать, не надо. Со временем сами придете к тому, о чем вам говорят....

А если не придете сами, то когда-нить устроитесь программистом, и тогда вам тим-лид или ведущий программист, увидев такое, просто скажет: "Чтоб такого больше не было!" =)
И это я перевел его гнусную брань на цензурный язык :D

P.S. А что вы будете делать с этими данными из БД, если они вам не в браузере понадобятся? Ну в эксель-таблице, например.... Обратно обрабатывать?
Можно не отвечать. Информация к размышлению.

  Ответить  
 
 автор: Mookapek   (05.02.2015 в 19:10)   письмо автору
 
   для: Sfinks   (05.02.2015 в 02:18)
 

> В бд надо не скриптов бояться, а sql-инъекций.

sql-инъекций я не боюсь, я с ними борюсь с помощью функции mysql_escape_string

  Ответить  
 
 автор: confirm   (05.02.2015 в 05:15)   письмо автору
 
   для: Mookapek   (05.02.2015 в 00:40)
 

>я фильтрую её один раз непосредственно после получения из формы.

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

  Ответить  
 
 автор: Mookapek   (05.02.2015 в 19:09)   письмо автору
 
   для: confirm   (05.02.2015 в 05:15)
 

Ну а если без эпитетов вроде "паники", "насилуете" и т.д., а конкретно что криминального в этой строке
$_POST['name'] = htmlspecialchars($_POST['name']) ?

Пока я услышал такие доводы:
"нечего htmlspecialchars делать в начале скрипта"
"Потому что в таком случае, данные и в БД попадут обработанными. А в БД оно не нужно."
"вы уже в панике занимаетесь тем, чем вообще не стоит"
"Хотеть можно все что угодно. А правильно в данной ситуации так, как вам тут все говорят."

Из этого всего я так и не понял, почему я делаю неправильно.

  Ответить  
 
 автор: Sfinks   (05.02.2015 в 21:26)   письмо автору
 
   для: Mookapek   (05.02.2015 в 19:09)
 

In english:
http://stackoverflow.com/questions/4882307/when-to-use-htmlspecialchars-function
http://stackoverflow.com/questions/7245440/should-htmlspecialchars-be-used-on-information-on-input-or-just-before-output
http://evertpot.com/when-to-escape-your-data/

Если мало, вот пара сот тыщ объяснений одного и того же:
https://www.google.ru/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#newwindow=1&q=htmlspecialchars%20before%20database

По русски - че-то беда с "по русски"..... Вот статья на хабре http://habrahabr.ru/post/143035/, но там автор как раз пропагандирует ваш подход. Поэтому можете сразу к камментам переходить. Там вы прочтете всю ту дискуссию, которая начинается здесь. И не вижу смысла продолжать ее здесь.

  Ответить  
 
 автор: Mookapek   (05.02.2015 в 19:02)   письмо автору
 
   для: Sfinks   (05.02.2015 в 00:34)
 

Я так и не понял, чем это
$name = htmlspecialchars($_POST['name']);
лучше этого
$_POST['name'] = htmlspecialchars($_POST['name']);

  Ответить  
 
 автор: Sfinks   (05.02.2015 в 21:34)   письмо автору
 
   для: Mookapek   (05.02.2015 в 19:02)
 

1. Тем что оригинал не изменяется. Но в вашем случае это не аргумент. Я понял.
2. Суперглобальные массивы лучше вообще не изменять. Я недавно столкнулся с одной CMS, которая просто валилась с фаталом, Когда полез в логи и код выяснять в чем дело, увидел такое объявление функции:
<?php
  
function funcname($_REQUEST$params){
    ..... 
тело функции ......
  }
Я конечно офигел и не понял вообще зачем так делать в принципе. Но у клиента на пхп 5.2 оно работало. И оказалось, что начиная с пхп 5.4 взять вот так и полностью переопределить суперглобальный массив уже нельзя! И я не исключаю, что их со временем вообще запретят редактировать.

  Ответить  
 
 автор: confirm   (05.02.2015 в 05:29)   письмо автору
 
   для: Mookapek   (04.02.2015 в 22:40)
 

Это не повод для паники.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования