Страницы

Поиск по вопросам

суббота, 30 ноября 2019 г.

Глобальная фильтрация $_GET и $_POST данных в PHP

#php


Здравствуйте.

Как лучше всего глобально фильтровать $_GET и $_POST данные?

Например, определенный код глобальной фильтрации в шапку сайта. 

Буду благодарен за пример.
    


Ответы

Ответ 1



Если код дырявый, то ему и фильтрация не поможет от взлома :) Фильтруйте и валидируйте данные по мере необходимости. Вы напишите универсальное решение которое например будет обрезать html теги, а они Вам пригодятся в другом месте. Если хотите защититься от XSS делайте в HTML какие-то определенные разрешенные теги с помощью специальных библиотек. Используйте, библиотеки для фильтрации данных, которых куча на github. Например, Filterus

Ответ 2



Объясню почему лучше не фильтровать, был у меня проэкт с фиильтрацией глобально на самописной cms и там все запросы переписывались типо того foreach($_POST as $_key => $_value) { $_POST[$_key] = filter_var($_value,FILTER_SANITIZE_SPECIAL_CHARS); } foreach($_GET as $_key => $_value) { $_GET[$_key] = filter_var($_value,FILTER_SANITIZE_SPECIAL_CHARS); } а после этого туча кастылей и багов что бы когда нужно обойти это самое ограничение. Это как объяснение почему не стоит фильтровать так как вы хотите, и дополнение к ответу @Firerepo что нужно фильтровать только когда это необходимо а не всё и вся.

Ответ 3



При возникновении подобных вопросов их очень полезно переводить из непонятного мира программирования в понятные всем реалии обычной жизни. Тогда он будет звучать так: Как глобально защититься от всех болезней? Смешно, да? Еще смешнее будет ответ. Что у нас помогает от болезней? Мыть руки перед едой, носить шарфик от сквозняка, пить таблетки, делать зарядку... Ну ок, допустим познакомился ты на вечеринке с девушкой, слово за слово, пришли к тебе домой. Ты, как правильный пионер, делаешь все, чтобы глобально защититься - идешь мыть руки, надеваешь шарфик, делаешь зарядку... а через недельку начинают вдруг выделяться непонятные жидкости из понятного места. Помогла тебе твоя глобальная защита? Будешь и дальше искать универсальное средство? Теперь в довершение к всему перечисленному будешь ходить на обед в презервативе? Или все-таки будешь применять средства защиты адресно - перед едой мыть руки, перед прогулкой надевать шарфик... ну и так далее. Если все еще не дошло: Взлом бывает разный. И средства защиты от одного никак не помогают от другого. Если у тебя введенные пользователем данные выводятся в HTML, то их надо защищать от XSS. Но если это введенный админом код HTML, то такая защита его испортит. При этом от SQL инъекции она не поможет, но зато испортит данные в БД. При этом ни защита от XSS, ни от SQL инъекции не поможет, если ты инклюдишь файл, имя которого передается из браузера. А пароль для защиты надо хэшировать. но если захэшировать любые другие данные, то они станут бесполезными. Ты все еще хочешь свою глобальную защиту?

Ответ 4



мои пять копеек: вы задаете неправильный вопрос и получаете ответ на неправильный вопрос. 1) Да, не надо глобально, по всему сайту фильтровать POST/GET/REQUEST 2) Проблема в том, что ваша задача сформулирована как "фильтровать POST/GET/REQUEST", хотя на самом деле у вас вопрос "как правильно валидировать входящие данные" 3) При этом вопрос звучит так, будто вы используете POST/GET/REQUEST во всех подрядд функциях/методах (иначе зачем вам глобальная фильтрация) - это - абсолютно недопустимо для большого/сложного/важного сайта. Это приведет к хаосу в коде, к костылям, копипасте, и, в конечном итоге к тем же самым проблемам с безопасностью. Это абсолютно недопустимо с точки зрения культуры разработки 4) примерный ответ на вопрос как правильно валидировать данные - убедиться, что вы не используете POST/GET/REQUEST и не обращаетесь к ним ни в одной функции, ни в одном методе вашего сайта кроме контроллеров (входных точек) или, как в симфони - обработчиков запроса. Для одностраничников - кроме нескольких первых строк сайта. Вы должны - руками или с помощью функции-обработчика запроса создавать переменные из запроса. После этого - если вы не используете движок, а делаете самописный велосипед - сделать (стырить из опенсорса) обработчики типичных для вашего сайта случаев - только строчки, только цифры. без спецсимволов. Формат email, формат даты. и применять их для переменных, которые передаются вашим контроллерам. 5) правильного ответа на вопрос как "фильтровать глобально" быть не может, но ближе всего, если вы упретесь рогом, будет вариант: создать функцию, которая вызывается всегда на всех страницах сайта, анализирует путь, куда пришел запрос и вызывает соответствующие обработчики для нужного пути. Это кровавый велосипед ада, но раз вы действуете без фреймворков и не хотите делать абстракции форм с валидаторами - у вас хотя бы будет изолированное от всего остального кода место, где вы, согласно подходящим для пути правилам валидации фильтруете ввод. После этого вы апдейтите _GET/_POST/_REQUEST и больше никогда их не трогаете нигде, кроме как для вытаскивания переменных.

Комментариев нет:

Отправить комментарий