Подтвердить что ты не робот

Когда лучше всего санировать вход пользователя?

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

4b9b3361

Ответ 1

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

Затем, независимо от того, что читает данные (часто сервер), я делаю проверку работоспособности, когда я читаю данные, просто чтобы убедиться, что из-за более определенного пользователя (например, файлов редактирования вручную или даже изменение пакетов!)

Изменить: в целом, санировать рано и дезинфицировать в любое время, когда вы потеряли из виду данные даже за секунду (например, File Save → File Open)

Ответ 2

Я обрабатываю свои пользовательские данные так же, как Раду...

  • Первая клиентская сторона, использующая оба регулярных выражения и управляющая допустимыми символами  ввод в поля данной формы с использованием javascript или jQuery, связанных с событиями, таких как  onChange или OnBlur, который удаляет любой запрещенный вход, прежде чем он сможет даже  Отправлено. Поймите, однако, что это действительно только дает возможность  пользователи знают, что данные также будут проверяться на стороне сервера. Это  больше предупреждения, чем любая фактическая защита.

  • Во-вторых, и я редко вижу это в наши дни, что первая проверка  сделанная на стороне сервера - это проверить местоположение места отправки формы.  Только разрешая отправку формы с страницы, которую вы указали как действительный  местоположение, вы можете убить script, прежде чем вы даже прочитали какие-либо данные. Предоставляется,  что само по себе недостаточно, поскольку хороший хакер со своим сервером может "обманывать",  как домен, так и IP-адрес, чтобы он казался вашему script, что он будет  от действительного местоположения формы.

  • Далее, и я не должен даже говорить об этом, но всегда, и я имею в виду ВСЕГДА, запустите  ваши скрипты в режиме taint. Это заставляет вас не лениться и быть прилежным  шаг № 4.

  • Санируйте пользовательские данные как можно скорее, используя хорошо сформированные регулярные выражения, соответствующие  данные, ожидаемые от любого поля в форме. Не используйте ярлыки, например  печально известный "волшебный рог единорога", чтобы пронзить ваши пятнистые чеки...  или вы также можете просто отключить проверку на выявление в первую очередь всех хороших  это будет сделано для вашей безопасности. Это как дать психопату острый нож, несущий  ваше горло, и сказал: "Ты действительно не причинишь мне боль, - сказал он."

    И вот где я отличаюсь от большинства других на этом четвертом шаге, поскольку я только санирую  пользовательские данные, которые я собираюсь фактически использовать, таким образом, чтобы обеспечить безопасность  риск, такой как любые системные вызовы, присвоения другим переменным или любое  хранить данные. Если я использую только данные, вводимые пользователем для сравнения с данными  Я сам хранил в системе (поэтому, зная, что мои собственные данные безопасны)  то я не утруждаю себя дезинфекцией данных пользователя, так как я никогда не собираюсь это делать  который представляет собой проблему безопасности. Например, введите имя пользователя в качестве  пример. Я использую только имя пользователя, чтобы проверить его на соответствие в  моя база данных, и если это правда, после этого я использую данные из базы данных для выполнения  все другие функции, которые я мог бы назвать в script, зная, что это безопасно, и никогда  после этого снова используйте данные пользователей.

  • В последнее время необходимо отфильтровать все попытки автоподготовки роботами в наши дни.  система идентификации человека, такая как Captcha. В наши дни это достаточно важно  что я потратил время на создание собственной схемы проверки подлинности человека, использующей фотографии  и вход для человека, чтобы войти в то, что они видят на картинке. Я сделал это, потому что  Я обнаружил, что системы типа Captcha действительно раздражают пользователей (вы можете сказать по их  прищурившись, пытаясь расшифровать искаженные буквы... как правило,  снова). Это особенно важно для сценариев, которые используют либо SendMail, либо SMTP  для электронной почты, поскольку они являются фаворитами для ваших голодных спам-ботов.

Чтобы обернуть это в двух словах, я объясню это так же, как и с моей женой... ваш сервер похож на популярный ночной клуб, и чем больше вышибал у вас есть, тем меньше проблем вы, вероятно, будете иметь в ночном клубе. У меня есть два вышибала за дверью (проверка на стороне клиента и аутентификация человека), один вышибала прямо внутри двери (проверка правильности местоположения подачи формы... "Это действительно вы на этом идентификаторе" ) и еще несколько вышибалов в близость к двери (запуск режима taint и использование хороших регулярных выражений для проверки пользовательские данные).

Я знаю, что это более старая должность, но я чувствовал, что это достаточно важно для всех, кто может прочитать ее после моего визита здесь, чтобы понять, что это не "волшебная пуля", когда дело доходит до безопасности, и требуется, чтобы все это работало в объединении друг с другом, чтобы обеспечить безопасность данных, предоставленных пользователем. Просто использование одного или двух из этих методов само по себе практически бесполезно, поскольку их сила существует только тогда, когда они все вместе.

Или в общем, как моя мама часто говорила... "Лучше безопасно, чем жаль".

UPDATE:

Еще одна вещь, которую я делаю в эти дни, - это кодирование Base64 всех моих данных, а затем шифрование данных Base64, которые будут находиться в моих SQL-базах данных. Это занимает около трети дополнительных байтов, чтобы сохранить его таким образом, но преимущества безопасности перевешивают дополнительный размер данных, на мой взгляд.

Ответ 3

К сожалению, почти никто из участников никогда не понимает, о чем они говорят. Буквально. Только @Kibbee удалось сделать это прямо.

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

Есть два миллиона различных сред, каждый из которых требует собственного, отличного форматирования данных. Кроме того, даже для одного определенного носителя требуется другое форматирование для него. strong > . Скажем, форматирование HTML бесполезно для javascript, встроенного в HTML-страницу. Или строковое форматирование бесполезно для чисел в запросе SQL.

На самом деле такая "санитация как можно раньше", как это предлагается в большинстве утвержденных ответов, просто невозможна. Как только вы не можете сказать, в какой определенной среде или средней части данные будут использоваться. Скажем, мы готовимся защищаться от "sql-injection", избегая всего, что движется. Но крики! - некоторые обязательные поля не были заполнены, и мы должны заполнить данные обратно в форму вместо базы данных... со всеми добавленными слэшами.

С другой стороны, мы старательно избегали всех "пользовательских ввода"... но в запросе sql у нас нет кавычек вокруг него, так как это число или идентификатор. И никакая "санитация" никогда не помогала нам.

С третьей стороны - хорошо, мы сделали все возможное, чтобы очистить ужасный, ненадежный и презираемый "пользовательский ввод"... но в каком-то внутреннем процессе мы использовали эти данные без какого-либо форматирования (как мы уже сделали все! ) - и кричит! получили во втором порядке инъекцию во всей красе.

Итак, с точки зрения использования реальной жизни единственным правильным способом было бы

  • форматирование, а не "санитария"
  • перед использованием
  • в соответствии с определенными правилами среды
  • и даже после подзаголовков, необходимых для этой среды разных частей.

Ответ 4

Это зависит от того, какую дезинфекцию вы делаете.

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

Для защиты от атак XSS, вероятно, было бы легче исправить данные до их хранения. Однако, как говорили другие, иногда приятно иметь первозданную копию именно того, что вводил пользователь, потому что как только вы его изменили, он потерял навсегда. Слишком уж плохо, что это не дурацкий доказательство того, что приложение просто выдает дезинфицированный HTML так, как вы можете убедиться, что вы не поймали SQL-инъекцию, используя подготовленные запросы.

Ответ 5

Раньше это хорошо, определенно, прежде чем пытаться его разобрать. Все, что вы собираетесь вывести позже или, в частности, перейти к другим компонентам (например, shell, SQL и т.д.), Необходимо очистить.

Но не переходите за борт - например, пароли хэшируются, прежде чем хранить их (правильно?). Хэш-функции могут принимать произвольные двоичные данные. И вы никогда не распечатаете пароль (правда?). Поэтому не разбирайте пароли и не подвергайте их дезинфекции.

Кроме того, убедитесь, что вы выполняете дезинфекцию из надежного процесса - JavaScript/что-то на стороне клиента хуже, чем бесполезная безопасность/целостность. (Это может обеспечить лучший пользовательский интерфейс, чтобы не срабатывать раньше, - просто сделайте это в обоих местах.)

Ответ 6

Самое главное - всегда быть последовательным, когда вы убегаете. Случайная двойная дезинфекция - хромая, а не санировка - опасна.

Для SQL просто убедитесь, что ваша библиотека доступа к базе данных поддерживает переменные связывания, которые автоматически ускользают от значений. Любой, кто вручную объединяет пользовательский ввод в строки SQL, должен знать лучше.

Для HTML я предпочитаю сбежать в последний момент. Если вы уничтожаете пользовательский ввод, вы никогда не сможете его вернуть, и если они совершают ошибку, они могут редактировать и исправлять позже. Если вы уничтожите исходный вход, он исчезнет навсегда.

Ответ 7

Perl имеет параметр taint, который учитывает весь пользовательский ввод "tainted", пока он не будет проверен с помощью регулярного выражения. Тонкие данные могут использоваться и передаваться, но они прикрывают любые данные, с которыми он соприкасается, до тех пор, пока они не станут незакрепленными. Например, если пользовательский ввод добавляется к другой строке, новая строка также испорчена. В принципе, любое выражение, содержащее испорченные значения, выдаст испорченный результат.

Тонкие данные могут быть выброшены по желанию (испортить данные по мере их поступления), но как только он используется командой, которая влияет на внешний мир, perl script терпит неудачу. Поэтому, если я использую испорченные данные для создания файла, создаю команду оболочки, меняю рабочий каталог и т.д., Perl завершится с ошибкой безопасности.

Я не знаю другого языка, который имеет что-то вроде "taint", но использование его было очень гласным. Удивительно, как быстро испорченные данные распространяются, если вы не сразу их разблокируете. Вещи, которые естественны и нормальны для программиста, такие как установка переменной на основе пользовательских данных или открытие файла, кажутся опасными и рискованными с включением tainting. Таким образом, лучшая стратегия для того, чтобы сделать все это, - это освободить, как только вы получите некоторые данные извне.

И я подозреваю, что лучший способ и на других языках: проверить данные пользователя сразу, чтобы ошибки и дыры в безопасности не могли распространяться слишком далеко. Кроме того, должно быть проще провести аудит кода для дыр в безопасности, если потенциальные отверстия находятся в одном месте. И вы никогда не сможете предсказать, какие данные будут использоваться для какой цели позже.

Ответ 8

Мое мнение состоит в том, чтобы дезинформировать пользовательский ввод, как только появится клиентская сторона и серверная сторона, я делаю это как

  • (клиентская сторона), разрешите пользователю введите только определенные клавиши в поле.
  • (клиентская сторона), когда пользователь переходит к следующему полю с помощью onblur, проверьте введенный вход против регулярного выражения, и обратите внимание на пользователя, если что-то не так.
  • (серверная сторона), проверьте вход снова, если поле должно быть INTEGER для проверки (в PHP вы можете использовать is_numeric()), если поле имеет хорошо известный формат проверьте его на регулярное выражение, все другие (например, текстовые комментарии), просто избегайте их. Если что-то подозрительно прекратит выполнение script и возвращает пользователю уведомление о том, что данные, которые он вводил, недействительны.

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

Ответ 9

Очистите данные перед их сохранением. Как правило, вы не должны предварительно выполнять действия ЛЮБОЕ SQL без предварительной очистки ввода. Вы не хотите подвергать себя атаке SQL-инъекции.

Я следую этим основным правилам.

  • Только модификация действий SQL, таких как, INSERT, UPDATE, DELETE через POST. Никогда не получайте.
  • Выбери все.
  • Если вы ожидаете, что пользовательский ввод будет чем-то, убедитесь, что вы проверяете, что это что-то. Например, вы запрашиваете номер, затем убедитесь, что это номер. Используйте проверки.
  • Использовать фильтры. Очистка нежелательных символов.

Ответ 10

Пользователи злы!

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

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

Ответ 11

Предположим, что все пользователи вредны. Санируйте все входные данные как можно скорее. Полная остановка.

Ответ 12

Я дезинфицирую свои данные прямо перед обработкой. Возможно, мне нужно будет первыми и фамильными полями и объединить их в третье поле, которое будет вставлено в базу данных. Я собираюсь дезинформировать входные данные, прежде чем я даже сделаю конкатенацию, поэтому я не получаю никаких ошибок обработки или вставки. Чем скорее, тем лучше. Даже использование Javascript на передней панели (в веб-настройке) идеально, потому что это произойдет без каких-либо данных, отправляемых на сервер для начала.

Страшная часть состоит в том, что вы даже можете начать дезинфекцию данных, выходящих из вашей базы данных. Недавний всплеск нападений ASPRox SQL Injection, которые шли вокруг, вдвойне леталь, поскольку он заразит все таблицы базы данных в данной базе данных. Если ваша база данных размещена где-то, где несколько учетных записей размещаются в одной базе данных, ваши данные становятся поврежденными из-за ошибки другого пользователя, но теперь вы присоединились к рядам хостинга вредоносных программ своим посетителям из-за отсутствия первоначальной ошибки вашего собственного.

Уверен, что это заставляет работать очень много, но если данные критические, то это достойная инвестиция.

Ответ 13

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

Ответ 14

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