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

Хранение вредоносного кода в базе данных - всегда есть правильный выход?

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

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

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

Однако следуя принципам, изложенным здесь и здесь, они предлагают подход сохранения пользовательского ввода как есть. Этот пользовательский ввод может быть не атакой SQL-инъекций, но может быть и другим вредоносным кодом. В этих случаях нормально хранить атаки XSS на основе Javascript в базе данных?

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

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

Каков правильный подход для сохранения вредоносного кода в базу данных в контексте среды веб-клиента/сервера?

[Для целей этого я игнорирую любые сайты, которые специально позволяют использовать код для них, я думаю о "нормальных" входах, таких как поля "Имя", "Комментарий" и "Описание".]

4b9b3361

Ответ 1

Определение: Я использую термин "sanitize" вместо фильтра или escape-кода, потому что есть третий вариант: отклонение недопустимого ввода. Например, возврат ошибки пользователю, говорящий, что "символ‽ не может использоваться в заголовке", не позволяет ему вообще сохранять его.

сохранение пользовательского ввода как

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

Почему мы все равно хотим хранить вредоносный код?

Бывают моменты, когда точность важнее паранойи. Например: обратная связь с пользователем может потребовать включения потенциально разрушительного кода. Я мог бы представить, как писать отзывы пользователей, которые гласят: "Каждый раз, когда я использую тип %00 как часть названия вики, приложение вылетает". Даже если названия wiki не нуждаются в символах %00, комментарий должен все равно передавать их точно. Несоблюдение этого в комментариях не позволяет операторам узнать о серьезной проблеме. Смотрите: Null Byte Injection

до устройства вывода, чтобы избежать ошибок вредоносного кода

Если вам нужно сохранить произвольные данные, правильный подход заключается в том, чтобы убежать при переключении на любой другой тип кодировки. Обратите внимание, что вы должны декодировать (unescape), а затем кодировать (escape); нет такой вещи, как некодированные данные - даже двоичный файл - это, по крайней мере, большой-Endian или Small-Endian. Большинство людей используют язык, построенный в строках, как "наиболее декодированный" формат, но даже это может стать неудобным при рассмотрении Unicode vs ASCII. Пользовательский ввод в веб-приложениях будет URLEncoded, HTTP Encoded или закодирован в соответствии с заголовком "Content-Type". См.: http://www.ietf.org/rfc/rfc2616.txt

Большинство систем теперь делают это для вас как часть шаблонов или параметризованных запросов. Например, параметризованная функция запроса, такая как Query("INSERT INTO table VALUES (?)", name), не позволит избежать одиночных кавычек или чего-либо еще в имени. Если у вас нет такого удобства, это помогает создавать объекты, которые отслеживают данные на тип кодирования, например HTMLString с помощью конструктора типа NewHTMLString(string) и Decode().

Следует ли использовать подход, при котором вредоносный код не входит в базу данных?

Поскольку база данных не может определить все будущие возможные кодировки, невозможно провести санацию против всех потенциальных инъекций. Например, SQL и HTML, возможно, не заботятся о backticks, но JavaScript и bash делают.

Ответ 2

Этот пользовательский ввод может не быть атакой SQL-инъекций, но это может быть другой вредоносный код. В этих случаях нормально хранить Javascript основанные атаки XSS в базу данных?

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

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

Как объяснялось выше, является ли фрагмент данных "вредоносным" в значительной степени зависимым от контекста и способа его использования. Чтобы привести пример, <script>...</script> как часть данных может вызвать серьезные проблемы при визуализации на веб-странице HTML. Однако это потенциально можно считать абсолютно законной полезной нагрузкой, которая будет показана в печатном документе/отчете. Это обоснование общего предложения хранить данные в необработанном виде и соответственно избегать их в зависимости от выходного носителя. Чтобы прямо ответить на ваш вопрос, да, можно утверждать, что хранить эти данные в базе данных абсолютно нормально, поскольку все механизмы экранирования доступны для всех возможных носителей.

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

Существует небольшая разница между санитарией и побегом. Первый относится к процессу фильтрации недопустимых данных перед их хранением, в то время как последний относится к преобразованию данных в соответствующий формат перед отображением на выбранный носитель. В соответствии с принципом глубокой защиты вы можете (и вы должны, если это возможно) выполнить дополнительный этап дезинфекции при получении данных. Однако для достижения этой цели необходимо предусмотреть, что вы должны знать характер ожидаемых данных. Например, если вы ожидаете номер телефона, тогда было бы разумно помечать данные, содержащие <script>, как недопустимые данные для пользователя. Это не обязательно было бы правдой, если бы вы ожидали отчета для назначения программирования. Итак, все зависит от контекста.