Purr()
смочь использовать членов парламента, не занимающих официального поста CatImpl
лет. Cat::Purr()
не был бы предоставлен такой доступ без friend
объявление. Когда дело доходит до отображения данных, отправленных пользователем, общепринятая мантра - «Фильтровать ввод, экранировать вывод».
Я бы рекомендовал не экранировать такие вещи, как объекты HTML и т. Д., Перед тем, как перейти в базу данных, потому что вы никогда не знаете, когда HTML не будет вашим средством отображения. Кроме того, разные типы ситуаций требуют разных типов экранирования вывода. Например, встраивание строки в Javascript требует другого экранирования, чем в HTML. Сделав это раньше, вы можете убаюкать себя ложным чувством безопасности.
Итак, основное практическое правило - продезинфицировать перед использованием и специально для этого использования; не упреждающе.
(Обратите внимание, я не говорю об экранировании вывода для SQL, только для отображения. Пожалуйста, все же делайте escape-данные, привязанные к строке SQL).
Мне нравится иметь / хранить данные в исходном виде. Я экранирую / фильтрую данные только в зависимости от того, где я их использую.
Существует как минимум два типа фильтрации / очистки, о которых вам следует позаботиться:
Очевидно, о первом нужно позаботиться до / когда вставка данных в базу данных для предотвращения SQL-инъекций.
Но вы уже знаете это, как вы сказали, поэтому я не буду больше об этом говорить.
Второй вопрос, с другой стороны, более интересный:
Итак:
htmlspecialchars
или эквивалент, который вероятно, не так уж и много пожирает процессор ... Так что это, вероятно, не имеет большого значения
Кстати, первое решение также хорошо, если пользователи используют что-то вроде bbcode / markdown / wiki при вводе данных, и вы визуализируете их в HTML ...
По крайней мере, если он отображается чаще, чем обновляется, особенно если вы не используете кеш для хранения чистой HTML-версии.
Очистите его для базы данных, прежде чем помещать в базу данных, если необходимо (т. е. если вы не используете уровень интерактивности базы данных, который сделает это за вас). Очистите его для отображения перед отображением.
Хранение вещей в ненужной в настоящее время цитируемой форме вызывает слишком много проблем.
Я всегда говорю убегать от вещей непосредственно перед тем, как передать их туда, где от них нужно убежать. Ваша база данных не заботится о HTML, поэтому экранирование HTML перед сохранением в базе данных не требуется. Если вы когда-нибудь захотите вывести что-то, отличное от HTML, или изменить разрешенные / запрещенные теги, вам, возможно, придется немного поработать. Кроме того, легче не забыть выполнить экранирование прямо тогда, когда это необходимо, чем на гораздо более ранней стадии процесса.
Также стоит отметить, что строки с экранированием HTML могут быть намного длиннее, чем исходный ввод. Если я введу японское имя пользователя в регистрационную форму, исходная строка может состоять только из 4 символов Unicode, но экранирование HTML может преобразовать ее в длинную строку "& # 12345; & # 67890; & # 18504; & # 31337;" . Тогда мое 4-символьное имя пользователя слишком длинное для поля вашей базы данных и сохраняется как два японских символа плюс половина escape-кода, что также, вероятно, мешает мне войти в систему.
Помните, что браузеры, как правило, избегают некоторых вещей, таких как не- Английский текст в самих отправленных формах, и всегда будет тот умник, который везде использует японское имя пользователя. Так что вы можете захотеть отключить HTML перед сохранением.
В основном это зависит от того, что вы планируете делать с вводом, а также от вашей среды разработки.
В большинстве случаев требуется исходный ввод. Таким образом, вы получите возможность настроить свой результат так, как вам угодно, не опасаясь потерять оригинал. Это также позволяет устранять такие проблемы, как сбой вывода. Вы всегда можете увидеть, что ваши фильтры содержат ошибки или вводимые пользователем данные ошибочны.
С другой стороны, некоторые короткие семантические данные могут быть отфильтрованы немедленно. 1) Вам не нужны беспорядочные номера телефонов в базе данных, поэтому для таких вещей было бы неплохо продезинфицировать. 2) Вы не хотите, чтобы какой-то другой программист случайно выводил данные без экранирования, и вы работаете в многопрограммной среде. Однако,