Как научиться проверять, что пользовательский ввод вменяется? - PullRequest
0 голосов
/ 04 марта 2011

Я не уверен в используемой здесь терминологии, поэтому позвольте мне указать, что когда я говорю «проверить» пользовательский ввод, я имею в виду, что следует ожидать от пользователей, которые назвали 30 февраля 2021 года своими днями рождения, а не защиту от инъекционных атак.

Есть ли какие-либо руководства по правильному выполнению или списки распространенных способов, которыми люди делают это неправильно? Стратегии обеспечения правильного ввода еще до его ввода (например, выбор из календаря вместо ввода в текстовое поле)?

Обратите внимание, что меня интересуют не языковые ответы (например, ASP.NET Validation Controls), а общие стратегии и принципы.

Ответы [ 3 ]

0 голосов
/ 04 марта 2011

Чем свободнее вы вносите поле ввода, тем больше вам нужно проверять. Некоторые языки могут облегчить вам проверку того, что текстовое поле является действительной датой; другие не могут.

С другой стороны, некоторые пользователи будут повторно вызывать щелчок на элементе управления календарем или трех раскрывающихся списках, чтобы ввести свою дату рождения. Они могут предпочесть просто ввести его. Это компромисс.

0 голосов
/ 04 марта 2011

Я бы порекомендовал использовать шаблон проектирования под названием «стратегия». это один из паттернов, созданных «бандой четырех» или «гоф» для краткости. Есть некоторые копии и варианты этого паттерна, о которых вы, возможно, слышали, например, «инверсия управления» и «внедрение зависимостей».

В любом случае для объектно-ориентированного языка вы создаете класс с именем validator, который проверяет данные в методе validate. вам нужно будет заставить validate принять какую-то соответствующую форму ввода или перегрузить ее, чтобы иметь разные методы для разных видов данных. или если у вас есть доступ к какой-либо форме обобщения, вы можете использовать это.

далее, конструктор этого класса должен принять объект «validatorstrategy» в качестве аргумента. и тогда фактическая проверка будет передана через объект стратегии.

Чтобы продвинуться дальше, вы можете создать некую систему генерации форм ввода, в которой вы будете указывать поля ввода с собственными именами типов. затем они будут генерировать различные поля ввода в зависимости от вашего языка интерфейса (html / android xml / java swing), и они также будут влиять на способ проверки ввода.

хм .. интересно, как решить проблему с двумя полями ввода пароля, которые должны иметь одинаковое содержание для проверки. как это будет выглядеть в системе генерирования форм? может быть, будет один тип ввода с именем «пароль», который будет генерировать одно поле ввода, которое не показывает ввод и не имеет проверки, и другой тип с именем «passwordsetter», который будет генерировать два поля ввода, которые не показывают ввод, и имеет стратегию проверки сравнения данных из двух полей. создание такой стратегии проверки может быть довольно сложным, хотя D:

0 голосов
/ 04 марта 2011

Вы ищете искомый термин подтверждение ввода .

Если вы укажете, что если вы используете элемент управления, в котором невозможно ввести неверные данные, вы можете помочь клиенту, но выпо-прежнему необходимо реализовать правильную проверку на сервере.

Я имею в виду, что следует ожидать от пользователей, которые назвали 30 февраля 2021 года своими днями рождения, а не защиту от атак с использованием инъекций

Почему бы и нетсделать оба?Есть ли конкретная причина, по которой вы хотите оставить себя открытыми для инъекционных атак?

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

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

...