@Sasha333

Фильтрация данных?

Понимаю, что вопрос уже объезжен вдоль и поперек, но тем ни менее. Везде есть расхождения кто рекомендует на вводе в бд фильтровать, кто рекомендует хранить обе версии (safe / unfiltered), кто-то рекомендует только выводе фильтровать + кэш.
Хотел бы узнать верный метод с учётом того, что необходимо отфильтровать такие данные:
1. Логин / пароль, вообще есть ли смысл фильтровать пароль кроме как htmlspecialchars, так-как по сути я нигде вывод ответа его не предоставляю, то есть пароль проверяется функцией password_verify.
2. Сайт является мониторингом игровых серверов, информация обновляется раз в минуту, то же название игровых серверов может содержать различные спецсимволы которые хотелось бы показывать гостям сайта, но и не допустить xss атак.

p.s. Как уже выше отметил, информация обновляется раз в минуту, по этому кэширование на 1 минуту всего, будет ли адекватной нагрузка на ресурсы при фильтрации на выводе даже с учётом кэширования?
Проект делаю как учебный, фреймворки не использую.
Мое мнение, что всё таки надо делать минимальную фильтрацию где это необходимо, то есть например при регистрации через preg_match разрешить в логин и имя только a-zа-яё0-9, email через встроенный filter_var($email, FILTER_VALIDATE_EMAIL), пароль htmlspecialchars для перестраховки. Где я зарание знаю какой тип данных должен получить проводить по маске в аналогии как описал для имени и логина.
  • Вопрос задан
  • 192 просмотра
Решения вопроса 1
delphinpro
@delphinpro Куратор тега PHP
frontend developer
пароль htmlspecialchars для перестраховки

зачем?
htmlspecialchars кодирует служебные символы html. Зачем ее применять для пароля?
И вообще, пароль у вас никогда нигде не хранится в открытом виде, только его хеш и то внутри системы.

минимальную фильтрацию где это необходимо

верное направление мысли.

Необходимо в двух местах:
1. запись базу
2. вывод на страницу

Чтобы защититься от sql-injection при записи, используйте подготовленные запросы.
Чтобы не сломать верстку при выводе данных — используйте htmlspecialchars при рендере страницы. А лучше возьмите шаблонизатор. Они все по умолчанию эскейпят вывод.

разрешить в логин и имя только a-zа-яё0-9


Это уже не фильтрация, а валидация данных, к безопасности особого отношения не имеет и выполняется в других местах приложения.
Простой пример. Пользователь отправил форму.
Вы первым делом сделаете проверку всех полей на допустимые значения, на заполненность и т.д., и если что вернете посетителя обратно на форму с указанием ошибки. Данные здесь не изменяются.
Если все в порядке, вы будете писать эти данные в базу. Как я уже написал, используя подготовленный запрос. Опять же, ничего менять в них не требуется.
Потом, вы будете эту информацию где-то выводить на странице. Вот здесь уже, перед выводом, вы прогоните все через htmlspecialchars, возможно какие-то еще корректировки сделаете.

Но, опять же вы пишете про универсальную фильтрацию на все случаи. Так не бывает.
Если вы ожидаете во входных данных исключительно текст, то можно, например, смело резать все теги перед записью в базу. А если вы получаете их из визуального редактора, с разметкой, то резать теги уже не нужно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
FanatPHP
@FanatPHP
Чебуратор тега РНР
Ты как и все пхпшники путаешь валидацию и форматирование данных.

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

Все остальное - это валидация. Делается по желанию. Не обязательно, но рекомендуется.
К безопасности отношения не имеет.
Просто чтобы программа работаела логичнее и предсказуемее.

Про кэширование вообще забудь, это ты наслушался дуремаров-теоретиков, которые сайт у мамки на ноутбуке видели два раза в жизни.
Ответ написан
@microbot
1. Можно сделать хэндлер для обработки входящих запросов и на нем все post и get данные проверить.
2. Получать, хранить и выводить данные можно как угодно, только нужно придерживаться нескольких принципов. Получаешь - обрабатывать (например: preg_replace('/[^\d]/', '', $string) - убираешь все, кроме цифр). Если в БД пишешь, то используешь экранирование спец. символов SQL - mysqli_real_escape_string($string). Для вывода на страницу всегда htmlspecialchars($string).
3. Вообще, можно скачать фреймворк какой-нибудь и посмотреть, как у них устроены подобные валидации, фильтрации и экранирования. Laravel, Yii, CodeIgniter, Symphony и т.к.
Ответ написан
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
про sql-инъекции почитай, если у тебя хотя бы 1000 обращений в минуту, то конечно кеш имеет смысл, кеш не должен быть монолитным
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Ведисофт Екатеринбург
от 25 000 ₽
YCLIENTS Москва
от 200 000 до 350 000 ₽
от 300 000 до 500 000 ₽
20 апр. 2024, в 13:56
7000 руб./за проект
20 апр. 2024, в 13:52
7000 руб./за проект
20 апр. 2024, в 13:23
1000 руб./за проект