Я имел ввиду не фильтрацию (удаление лишних символов), а экранирование. Использование HTML для форматирования текста это отдельная история. Как быть, когда есть представления в разных форматах (HTML, JSON, plain-text)? В таком случаю, думаю, сохранение данных в БД в каком-то одном формате только мешает. А сохранение в нескольких форматах — это избыточность, которая может привести к ошибкам (кто-то забудет обновить форматированный текст при обновлении объекта). Хотя с другой стороны, от этого страдает производительность.
В моём случае не известен точный вектор развития проекта, поэтому ожидать можно чего угодно. И хотелось бы в первую очередь думать о простоте поддержки и понятности системы.
Если есть вероятность того, что пользовательский текст понадобится в неизменном виде, то нужно хранить его в БД в неизменном виде. Для этого надо:
На входе в контроллере проверить основные ограничения текста, которые играют роль для модели (длина, количество слов, наличие пробелов по краям, возможно отсутствие буквы ё).
При вставке текса в SQL-код проэкранировать SQL-спецсимволы. Но лучше всего, чтобы это сделал драйвер БД, абстрагировав программиста от этой проблемы, как это делает PDO в PHP. После такого запроса текст в БД будет именно тот, который ввёл пользователь.
При вставке текста в HTML-код проэкранировать HTML-спецсимволы, при вставке в JSON-код проэкранировать JSON-спецсимволы и т.д.
Хранение текста в БД в неизменном виде позволит подключать любые другие представления безо всяких проблем. Плюс позволяет легко решить ситуацию, когда используемая фильтрующая функция вдруг стала уязвимой.
Исключение составляет случай, когда HTML используется для разметки текста (вместо markdown, например), и это в рамках модели. В таком случае надо тщательно отфильтровать такой текст в контроллере или модели при получении данных, удалив весь код, который представляет опасность с точки зрения XSS.
Спасибо за аргумент. А что вы скажете по поводу этого аргумента (аргумент не мой):
Представлений много, а ввод данных один. Можно случайно забыть где-то в шаблоне сделать фильтрацию, а можно один раз отфильтровать в контроллере при получении данных и не мучиться.
Пума Тайланд: Понятное дело, что деградация не на столько сильная, чтобы беспокоиться об этом; по этому вопроса спора нет. Меня интересует только ответ на вопрос "что заставляет батарею деградировать". Сюда написал свои наблюдения, чтобы "поделиться с миром".
Пума Тайланд: В 2014 году я купил новую батарею для своего MacBook. Она лежала у меня 2 года и буквально неделю назад я её поставил. Не заряжая её, я включил ноутбук и посмотрел статистику батареи, там было следующее: заряд 53%, ресурс батареи 103%, количество циклов заряда-разряда 1, возраст батареи 3.5 года. После калибровки батареи данные по ресурсу не поменялись. По субъективным ощущениям батарея держит намного дольше, как на новом ноутбуке.
В общем, я не верю, что дергадация батареи зависит от её возраста, следовательно, зависит от того, как её используют. Это даже не вопрос веры, а фактов.
Пума Тайланд: У меня есть интересные факты. У моего MacBook Air 2012 года 1100 циклов заряда-разряда, ресурс батареи 52%. У моего знакомого такой же MacBook Air 2012 года, при этом 120 циклов заряда-разряда и ресурс батареи 88%(!). Это говорит о том, что устаревание батареи зависит в первую очередь не от её возраста, а значит, есть способ продлить её жизнь.
Пума Тайланд: Я экспоненциально посчитал. Должно получиться 40%. Ноутбук MacBook Air, 1100 циклов заряда-разрада. Оригинальную и текущую ёмкость говорит сам ноутбук в информации о системе.
Веб дизайн это по большей части не красивые картинки, а подача материала и веб-приложения, поэтому я бы ещё добавил навыки типографики и юзабилити. Да и пункты 3 и 4 это уже не совсем область ответственности дизайнера.
БСО, к сожалению, нельзя использовать для получения денег от организаций.
Такое ощущение, что проще будет оформить договор авторского заказа и получить оплату как физическое лицо.