Выходная или входная фильтрация?
-
30-09-2019 - |
Вопрос
Выходная или входная фильтрация?
Я постоянно вижу людей, пишущих «фильтр вы вводах», «Sanitize ваши входы», не доверяйте пользователям пользовательских данных, но я только согласен с последним, где я считаю, что доверие к любым внешним данным, даже если она является внутренним относительно система.
Входная фильтрация:Самое распространенное, что я вижу. Возьмите данные Post Post или любой другой внешний источник информации и определите некоторые границы при сохранении его, например, убедитесь, что текст - это текст, цифры - это цифры, что SQL является действительным SQL, что HTML является действительным HTML и что он не содержит вредных Разметка, а затем вы сохраняете «безопасные» данные в базе данных.
Но при получении данных вы просто используете необработанные данные из базы данных.
По моему личному мнению, данные никогда не в безопасности никогда. Хотя это звучит легко, просто фильтруйте все, что вы получаете от форм и URL, на самом деле это намного сложнее, чем это может быть безопасным для одного языка, но не другого.
Выходная фильтрация:Используя это таким образом, я сохраняю необработанные неизменные данные, что бы она ни было, с подготовленными утверждениями в базу данных, а затем отфильтровать проблемный код при доступе к данным, это имеет свои преимущества:Это добавляет слой между HTML и скриптом бокового сервера.которые я считаю, чтобы быть разделением доступа к данным в родах.
Теперь данные отфильтрованы в зависимости от контекста, например, у меня могут иметь данные из базы данных, представленной в HTML-документе, как просто-сбеженный текст, или как HTML или как угодно.
Недостатки вот в том, что вы никогда не забудете добавить фильтрацию, что немного сложнее, чем с входной фильтрацией, и он использует немного более CPU при предоставлении данных.
Это не значит, что вам не нужно делать проверки проверки, вы все еще делаете, просто вы не сохраняете отфильтрованные данные, вы его проверяете и предоставляете пользователя сообщение об ошибке, если данные каким-то образом неверны.
Таким образом, вместо того, чтобы идти с «фильтровать ваши входы», может быть, он должен быть «подтвердить ваши входы, отфильтровать ваши выходы».
Итак, я должен идти с «входной проверкой и фильтрацией» или «Vavelation Validation и выходной фильтрацией»?
Решение
Нет общего «фильтрации» для ввода и вывода.
Проверьте свой вход, убейте свой выход. Как вы это делаете, зависит от контекста.
Валидация заключается в том, что входной вход падает в разумных диапазонах, таких как длина строк, числовая численность количества доллара или что обновляется запись, принадлежащая пользователю, выполняющее обновление. Реконала о поддержании логической консистенции ваших данных и предотвращения того, чтобы люди подобные тому, как обнуривание цены продукта, которую они покупают или удаляются записи, к которым они не должны иметь доступ. Это не имеет ничего общего с «фильтрацией» или избежать определенных символов на вашем входе.
Сбежав - это вопрос контекста, и действительно имеет смысл, когда вы делаете что-то с данными, которые могут быть отравлены, впрыскивая определенные символы. Побегайте символы HTML в данных, которые вы отправляете в браузер. Побег символов SQL в данных, которые вы отправляете в базу данных. Выбежать цитаты, когда вы пишете данные внутри JavaScript <script>
Теги. Просто осознайте, как данные вы имеете дело с интерпретацией системы, вы передаваете ее и сбежав соответствующим образом.
Другие советы
Лучшее решение - фильтр обоих. Только кто-то делает более вероятно, что вы пропустите случай, и можете оставить вас открытыми для других типов атак.
Если вы делаете только входную фильтрацию, атакующий может найти способ обойти ваши входы и вызывать уязвимость. Это может быть кто-то с доступом к вашей базе данных ввода данных вручную, это может быть злоумышленник, загружающий файл через FTP или какой-либо другой канал, который не проверяется, или многие другие методы.
Если вы выполняете только выходную фильтрацию, вы можете оставить себя открытым для SQL Injection и других боковых атак на сервере.
Лучший метод - фильтровать как ваши входы, так и выходы. Это может вызвать больше нагрузки, но значительно снижает риск нападающего на поиск уязвимости.
Звучит как семантика для меня. В любом случае важно помнить, чтобы убедиться, что плохие данные не попадают в систему.
Выполнение выходной фильтрации вместо входной фильтрации просит инъекцию SQL.