Комплексная проверка на стороне сервера
-
02-07-2019 - |
Вопрос
В настоящее время у меня есть довольно надежная система проверки на стороне сервера, но мне нужны отзывы, чтобы убедиться, что я охватил все аспекты.Вот краткое описание того, чем я занимаюсь на данный момент:
Убедитесь, что ввод не пуст или слишком длинный.
Экранируйте строки запроса, чтобы предотвратить SQL-инъекцию.
Использование регулярных выражений для отклонения недопустимых символов (это зависит от того, что отправляется)
Кодирование определенных тегов HTML, например <script> (все теги кодируются при хранении в базе данных, а некоторые декодируются при запросе для отображения на странице)
Есть ли что-то, что мне не хватает?Приветствуются примеры кода или регулярные выражения.
Решение
Вам не нужно «экранировать» строки запроса, чтобы предотвратить SQL-инъекцию — вместо этого вам следует использовать подготовленные операторы.
В идеале фильтрация входных данных происходит до любой другой обработки, поэтому вы знаете, что она всегда будет использоваться.Потому что в противном случае вам достаточно пропустить только одно место, чтобы стать уязвимым для проблемы.
Не забудьте закодировать HTML-объекты при выводе — чтобы предотвратить XSS-атаки.
Другие советы
Вы должны кодировать каждый тег html, а не только «недействительные».Это горячие дебаты, но в основном они сводятся к тому, что всегда будет какая-то недопустимая комбинация HTML, которую вы забудете правильно обработать (вложенные теги, несовпадающие теги, которые некоторые браузеры интерпретируют «правильно» и так далее).Поэтому, на мой взгляд, самый безопасный вариант — сохранить все как htmlentities, а затем на выходе распечатать проверенное дерево HTML-безопасного подмножества (в виде сущностей) из содержимого.
Запускайте все проверки на стороне сервера в библиотеке, предназначенной для этой задачи, чтобы улучшения в одной области повлияли на все ваше приложение.
Дополнительно включите защиту от известных атак, таких как обход каталогов и попытки доступа к оболочке.
На этот вопрос/ответ есть несколько хороших ответов, которые вы ищете.
(Ориентирован на PHP, но опять же вы не указали язык/платформу, и некоторые из них применимы за пределами мира PHP.):
Какой лучший метод очистки пользовательского ввода с помощью PHP?
Вы можете проверить Расширение фильтра для фильтрации данных.Это не гарантирует, что вы полностью герметичны, но лично я чувствую себя намного лучше, используя его, потому что за этим кодом просматривает множество глаз.
Также считайте подготовленные заявления поддержанными.Экранирование данных в ваших SQL-запросах осталось в прошлом.