validate html ввод тега для управления текстовым полем глобально в файле web.config

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

Существует большая статья, написанная на www.html5rocks.com - Глубокое погружение в мутные воды загрузки скрипта .

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

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

Учитывая, что у вас есть четыре сценария с именем script1.js, script2.js, script3.js, script4.js, вы можете сделать это с помощью async = false:

[
  'script1.js',
  'script2.js',
  'script3.js',
  'script4.js'
].forEach(function(src) {
  var script = document.createElement('script');
  script.src = src;
  script.async = false;
  document.head.appendChild(script);
});

Теперь, Spec говорит: Скачайте вместе, выполните в порядке как скоро как вся загрузка.

Firefox & lt; 3.6, Opera говорит: я понятия не имею, что это за «асинхронная» вещь, но это так происходит. Я запускаю скрипты, добавленные через JS, в том порядке, в котором они добавлены.

Safari 5.0 говорит: «Я понимаю», async ", но не понимают, что он устанавливает значение" false "с помощью JS. Я буду выполнять ваши скрипты, как только они приземлятся, в любом порядке.

IE & lt; 10 говорит: «Не знаю, как« асинхронно », но есть обходное решение, использующее« onreadystatechange ».

Все остальное говорит:« Я твой друг, мы сделаем это по книге ».

Теперь полный код с IE & lt; 10:

var scripts = [
  'script1.js',
  'script2.js',
  'script3.js',
  'script4.js'
];
var src;
var script;
var pendingScripts = [];
var firstScript = document.scripts[0];

// Watch scripts load in IE
function stateChange() {
  // Execute as many scripts in order as we can
  var pendingScript;
  while (pendingScripts[0] && ( pendingScripts[0].readyState == 'loaded' || pendingScripts[0].readyState == 'complete' ) ) {
    pendingScript = pendingScripts.shift();
    // avoid future loading events from this script (eg, if src changes)
    pendingScript.onreadystatechange = null;
    // can't just appendChild, old IE bug if element isn't closed
    firstScript.parentNode.insertBefore(pendingScript, firstScript);
  }
}

// loop through our script urls
while (src = scripts.shift()) {
  if ('async' in firstScript) { // modern browsers
    script = document.createElement('script');
    script.async = false;
    script.src = src;
    document.head.appendChild(script);
  }
  else if (firstScript.readyState) { // IE<10
    // create a script and add it to our todo pile
    script = document.createElement('script');
    pendingScripts.push(script);
    // listen for state changes
    script.onreadystatechange = stateChange;
    // must set src AFTER adding onreadystatechange listener
    // else we’ll miss the loaded event for cached scripts
    script.src = src;
  }
  else { // fall back to defer
    document.write('  
    

    

1 ответ

Проверка подлинности XSS включена в MVC по умолчанию. Таким образом, вам не нужно ограничивать ввод HTML (он уже ограничен), вместо этого вы разрешаете ввод HTML только для определенных свойств Actions или ViewModel, которые вы отметили.

Настройка атрибута [ValidateInput(false)] в действии будет отключить проверку на все действие.

Атрибут [AllowHtml] в свойстве ViewModel позволяет вводить только HTML-данные для этого свойства. Это рекомендуемый способ включения ввода HTML.

Чтобы решить вашу проблему, вы должны удалить [ValidateInput(false)] из своего действия.

Дальнейшее чтение: Предотвращение атак XSS в ASP.NET MVC с использованием ValidateInput и AllowHTML .

Также убедитесь, что вы настроили правильный requestValidationMode в своем web.config. requestValidationMode 4.5 vs 2.0 .


Чтобы предоставить настраиваемое сообщение об ошибке, если проверка входных данных завершилась неудачно, зарегистрируйте IExceptionFilter в Global.asax, который проверяет, выбрано ли исключение HttpRequestValidationException.

public class HttpRequestValidationExceptionFilter : FilterAttribute, IExceptionFilter {

    public const int MySpecialStatusCodeIndicatingValidationError = 1337;

    public void OnException(ExceptionContext filterContext) {
        if (!filterContext.ExceptionHandled && filterContext.Exception is HttpRequestValidationException) {
            // redirect to error controller, which shows custom message
            filterContext.Result = new HttpStatusCodeResult(MySpecialStatusCodeIndicatingValidationError);
            filterContext.ExceptionHandled = true;
        }
    }
}

Для возможного механизма обработки ошибок с помощью специальных кодов состояния см. Обработка ошибок ASP.NET MVC 404 . Идея состоит в распознавании MySpecialStatusCodeIndicatingValidationError и перенаправлении на правильное действие в пользовательском HttpErrorController.

0
ответ дан Georg Patscheider 17 August 2018 в 13:29
поделиться
  • 1
    Спасибо за вашу информацию, но я хочу отправить сообщение об ошибке пользователю, когда пользователь вводит html-теги в текстовое поле, и я хочу, чтобы это обрабатывалось глобально в одном месте, это может быть либо в web.config, либо в Global .asax – V.SSL 13 July 2018 в 10:21
  • 2
    См. Мое редактирование о том, как поймать исключение, вызванное проверкой запроса по умолчанию, и предоставить настраиваемое сообщение. – Georg Patscheider 13 July 2018 в 12:03
  • 3
    Спасибо за информацию, у меня есть еще один dout, есть ли способ очистить поставщиков валидации (которые мы даем в global.asax ModelValidatorProviders.Providers.Clear ();) и добавляем пользовательский поставщик проверки в файле web.config – V.SSL 13 July 2018 в 13:25
Другие вопросы по тегам:

Похожие вопросы: