Как использовать AntiXss с веб-API - PullRequest
1 голос
/ 11 ноября 2019

Это вопрос, который задавался ранее, но я не нашел информацию, которую я ищу, или, возможно, я просто упускаю суть, поэтому, пожалуйста, потерпите меня. Я всегда могу скорректировать свой вопрос, если задаю его неправильно.

Если, например, у меня есть конечная точка POST, которая использует просто объект DTO с 2 свойствами (то есть companyRequestDto) и содержит тег script водно из его свойств. Когда я вызываю свою конечную точку из Postman, я использую следующее:

{
   "company": "My Company<script>alert(1);</script>",
   "description": "This is a description"
}

Когда она получена действием в моей конечной точке,

public void Post(CompanyRequestDto companyRequestDto)

мой объект DTO будет автоматически установлени его свойства будут установлены на:

companyDto.Company = "My Brand<script>alert(1);</script>";
companyDto.Description = "This is a description";

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

1) Запрос: Итак, мой первый вопрос: как вывести ошибку, если опубликованный DTO содержит недопустимое содержимое, например тег?

Я смотрел на MicrosoftAntiXss, но я не понимаю, как с этим справиться, так как данные, представленные в свойствах объекта DTO, не являются строкой html, а просто строкой, так что мне здесь не хватает, так как я не понимаю, как это помогает санации илипроверка переданных данных.

Когда я звоню

var test = AntiXss.AntiXssEncoder.HtmlEncode(companyRequestDto.Company, true);

Возвращает закодированную строку, но что тогда ??

Есть ли способ удалить запрещенные ключевые слова или простопросто скинуть ошибку?

2) Ответ: Предполагая, что 1) не был реализован или не работал должным образом, и он в конечном итоге был сохранен в нашей базе данных, я должен возвращать закодированные данные в виде строки json, поэтомувместо возврата:

"My company"

Должен ли я вернуть:

"My Company&lt;script&gt;alert(1)&lt;/script&gt;"

Должен ли браузер (или любое другое приложение) отображаться так, как показано ниже?:

"My Company&lt;script&gt;alert(1)&lt;/script&gt;"

3) Код: Предполагая, что есть способ санировать или выдавать ошибку, должен ли я использовать это на уровне свойств, используя атрибут во всех свойствах моих различных объектов DTO или есть способприменить это на уровне класса, используя атрибут, который будет проверять и / или дезинфицировать все строковые свойства объекта DTO, например?

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

Спасибо.

ОБНОВЛЕНИЕ 1:

Я только что закончил получать ответ от Остановка XSS при использовании WebAPI

Этовероятно, самый близкий к тому, что я ищу. За исключением того, что я не хочу кодировать данные, так как я не хочу хранить их в своей базе данных, поэтому я посмотрю, смогу ли я выяснить, как выдать ошибку, но я не уверен, каково будет условие,Может быть, я должен просто искать такие символы, как <,>,;и т. д. ... так как они вряд ли будут использоваться ни в одном из наших полей.

1 Ответ

1 голос
/ 11 ноября 2019
  1. Вам необходимо учитывать, где будут использоваться ваши данные, когда вы думаете о кодировании, так что данные, содержащиеся в нем, являются проблемой только в том случае, если они отображаются в виде HTML, поэтому если вы собираетесь отображать данные, которые имеютпредоставленные пользователями в любом месте, вероятно, в тот момент, когда вы собираетесь его отобразить, вы захотите html-кодирование для отображения (вы хотите избежать многократного html-кодирования одной и той же строки при сохранении, например).

  2. Опять же, это зависит от того, для чего будет использоваться ответ ... вы, вероятно, захотите html кодировать его в том месте, где он будет отображаться ... помните, если вы кодируете что-то в ответеон может не совпадать с тем, что содержится в данных, поэтому, если вызывающий код может что-то сделать, например, вызвать ваш API для поиска компании с таким именем, что может вызвать проблемы. Если браузер отображает HTML-кодированную версию, она может выглядеть уродливо, но это лучше, чем пользователи, скомпрометированные атаками XSS.

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

...