Big_Trouble
@Big_Trouble
Программист недосамоучка

Почему для защиты от XSS опасные символы нужно экранировать, а не удалять?

Почему для защиты от XSS опасные символы нужно именно экранировать, а не удалять к примеру функцией str_replace(), ведь если исключить возможность использовать эти символы, то и XSS возникать не должно.
  • Вопрос задан
  • 428 просмотров
Пригласить эксперта
Ответы на вопрос 5
@LaraLover
Вы можете запретить спец символы, например в username, email. Но это глупо делать в пароле или в контенте страницы, я думаю мало кто захочет читать статью без знаков препинания.
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
Потому что не бывает никаких "опасных символов".
Символ, который является "опасным" в одном контексте, в другом будет полезным.
Если так начать удалять потенциально опасные символы, то от контента ничего не останется.

Смешнее всего видеть такие вопросы на сайтах типа тостера. Вот клиент сам же накатал ответ в котором "опасных" символов overдофига. Во что превратится этот красивый ответ если из него повырезать все ужжжжасно опасные символы?
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Потому, что кто-то придумал этот бред, а все - поддакивают.

Нелья делать НИ УДАЛЕНИЕ, НИ ЭКРАНИРОВАНИЕ! И вот почему:
1. Удаляем - "портим" представление и искажаем понимание реальной хранящейся информации в бд: данные на странице будут отличаться от данных в базе. И не факт, что это предотвратит XSS.
2. Экранируем - выводим всё, что в базе и позволяем искать "дыры", чтобы "ломать сайт полностью".

И, ВНЕЗАПНО! у нас есть 3-й вариант!
Правильно: валидировать целостность XML-структуры и "белый" список тегов в ней, если текст содержит символы открытия/закрытия тегов или любой из ограничителей строковых данных в xml-разметке. Не проходит валидацию - просто игнорировать (присваивать null, возвращать false, etc.).
Ответ написан
@Karpion
Поясню на примере шелла - мне кажется, это проще всего.

Допустим, есть некая программа, запускаемая с командной строки. И эта программа интерпретирует свои аргументы так, что звёздочка имеет какое-то особое значение. Например, find откуда_искать -name маска_для_поиска - и маска_для_поиска вполне может содержать звёздочку.
Однако, если я напишу маску_для_поиска просто так - то шелл увидит там звёздочку и станет интерпретировать её по-своему, в результате чего find получит не то, что я хотел ему передать, а что-то иное. И чтобы шелл не своевольничал - я должен экранировать звёздочку и прочие спец.символы.

Другой пример - форум с хранением содержимого в SQL-DB:
Понятно, что юзеры имеют законное право использовать в тексте любые печатные символы; в т.ч. и те, которые являются спец.символами в SQL. Соответственно, при формировании SQL-запроса - спец.символы надо экранировать, иначе возможна SQL-инъекция.
Ответ написан
Комментировать
Sanes
@Sanes
В идеале надо использовать библиотеку, типа html-sanitizer.
Например мы хотим разместить код. Соответственно надо или пропустить все теги, как есть или использовать функцию htmlspecialchars.
И самое главное, что это надо сделать только внутри тегов pre>code
Для остального белый список тегов.
Стандартные функции вам это не позволят сделать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽