Защита от внедрения JS с помощью ASP.NET MVC - PullRequest
0 голосов
/ 16 февраля 2011

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

Пока что я создал атрибут проверки, чтобы проверить входящий html на хитрость

[AttributeUsage(AttributeTargets.Property, 
    AllowMultiple = false, Inherited = true)]
public class CheckHtml : ValidationAttribute, IMetadataAware {

    private static Regex _check = new Regex(
        @"<script[^>]*>.*?<\/script>|<[^>]*(click|mousedown|mouseup|mousemove|keypress|keydown|keyup)[^>]*>",
        RegexOptions.Singleline|RegexOptions.IgnoreCase|RegexOptions.Compiled);

    protected override ValidationResult IsValid(
        object value, ValidationContext validationContext) {

        if(value!=null
            && _check.IsMatch(value.ToString())){

            return new ValidationResult("Content is not acceptable");
        }

        return ValidationResult.Success;
    }

    /// <summary>
    /// <para>Allow Html</para>
    /// </summary>
    public void OnMetadataCreated(ModelMetadata metadata) {
        if (metadata == null) {
            throw new ArgumentNullException("metadata");
        }
        metadata.RequestValidationEnabled = false;
    }
}

Этого будет достаточно? Что вы делаете, чтобы проверить на такую ​​шалость?

Ответы [ 3 ]

3 голосов
/ 16 февраля 2011

Взгляните на библиотеку Microsoft AntiXSS . Он может похвастаться AntiXSS.GetSafeHtmlFragment() методом, который возвращает HTML без всякой XSS-ошибки.

Как указывал Дэвид, белый список - это всегда путь. AntiXSS использует белый список элементов / атрибутов HTML, которые безопасны для XSS / отфильтровывает JavaScript.

2 голосов
/ 16 февраля 2011

Этого будет достаточно?

Нет. Это черный список. Черный список никогда не бывает достаточным.

Нет. Это регулярное выражение. Регулярные выражения - это чушь при работе с произвольным HTML.

Что вы делаете, чтобы проверить на такую ​​шалость?

Правильный анализатор HTML в сочетании с белым списком.

0 голосов
/ 16 февраля 2011

Джефф Этвуд хорошо обсудил эту тему по рефакторингу моего кода. Определенно стоит потратить время, чтобы проверить это: http://refactormycode.com/codes/333-sanitize-html

Финальная версия должна быть довольно солидной. Безопасность никогда не бывает 100% -ной вещью, но это, вероятно, лучше, чем большинство других примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...