Как избежать двойного экранирования и обезопасить себя от xss с помощью функции set_value в codeigniter

#php #codeigniter-3 #xss

#php #codeigniter-3 #xss

Вопрос:

Привет и спасибо за чтение.

Я работаю над CodeIgniter 3 с PHP 7.0 и использую формы с form_helper.

Сначала у меня возникли проблемы с повторным заполнением формы функцией set_value после использования библиотеки form_validation в моем контроллере. Я использовал set_value в моем form_helper следующим образом :

 $my_input = array(
    'name' => 'my_name',
    'value' => set_value('my_name')
);
echo form_label('Title :');
echo form_textarea($my_input);
  

Итак, с некоторым текстом, подобным этому :

 she's the chief's lady
  

Форма была повторно заполнена следующим образом :

 sheamp;#039;s the chiefamp;#039;s lady
  

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

НО если в форме есть другая ошибка, то предложение будет зарегистрировано следующим образом :

 sheamp;amp;#039;s the chiefamp;amp;#039;s lady
  

и теперь мои данные больше не соответствуют действительности.

Итак, я прочитал документ CodeIgniter и нашел это :

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

Отлично, я решил свою проблему с экранированием. Но как насчет внедрения xss? Эта практика кажется очень опасной, я не понимаю, почему это лучший способ, если я доверяю ДОКУМЕНТУ CodeIgniter (я провел быстрый тест с помощью скрипта оповещения и сбоя системы безопасности). Итак :

1) Каков наилучший способ обезопасить себя и избежать экранирования, когда мне приходится повторно заполнять форму???

2) Единственный человек, видящий злой ввод, — это тот, кто его написал, но все еще ли это опасно для моего веб-приложения или нет???

3) И если нет опасности при повторном заполнении формы отправленными данными, зачем нам нужно устанавливать для параметра escape значение FALSE в set_value() ? Почему значение по умолчанию не равно FALSE ?

РЕДАКТИРОВАТЬ: я добавил 2 последних вопроса

Ответ №1:

CodeIgniter надежно предотвратит внедрение SQL, когда что-либо попадет в его модели. Поскольку вы просто отображаете результат в браузере, нет риска внедрения, поскольку все, что вы делаете, это отображаете то, что они написали им в ответ.

Но у вас есть хорошая мысль о JavaScript или другом теге. Предполагая, что единственный человек, который может получить доступ к полю ввода, является автором его содержимого, и что вы экранируете его результаты при просмотре другими людьми, тогда единственный человек, для которого они могут создать окно предупреждения (или хуже), — это они сами, что, конечно, они могут сделать в любом случае в консоли.

Если вы все еще беспокоитесь, вы всегда можете использовать strip_tags() PHP для этого поля.

Комментарии:

1. Итак, если я правильно понял, это не опасно для приложения и конечных пользователей, потому что это затрагивает только автора плохого контента !? Это все, что я хочу знать, спасибо за ответ 😉 PS: интересная функция strip_tags(), но не на 100% безопасная, поэтому я предпочитаю что-то вроде HTML Purifier.

2. Я подумал о том, что вы сказали, и у меня есть другой вопрос: если нет опасности при повторном заполнении формы отправленными данными, зачем нам устанавливать для параметра escape значение FALSE в set_value() ? Почему значение по умолчанию не равно FALSE ? И, чтобы быть уверенным, не могли бы вы подтвердить этот факт, пожалуйста? Единственный человек, видящий злой ввод, — это тот, кто его написал, но все еще ли это опасно для моего веб-приложения или нет??? Спасибо @Thomas Edwards