Потенциально опасное значение Request.Form

В моем приложении ASP.NET я получаю следующее сообщение об ошибке во время POST с определенным вводом:

От клиента было обнаружено потенциально опасное значение Request.Form.

Я знаю, что это происходит потому, что функция .NET под названием «Проверка запроса» предотвращает отправку потенциально опасных символов, которые могут быть использованы в XSS-атаке. Однако я использую HTML-редактор, и мне нужно отключить эту функцию для этого редактора.

Я могу сделать это в своем файле web.config, но это действует глобально, что меня не устраивает, поскольку оно отключает эту функцию безопасности для всех полей в моем приложении, а не только для редактора HTML.

Я попытался установить свойство ValidateRequest директивы Page на определенных страницах, на которых я хотел отключить это, но, к сожалению, это не сработало.

Кто-нибудь может придумать причину, почему это не сработало?

Изменить

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

Теперь, когда сам редактор работает и больше не выдает эту ошибку... Я столкнулся с другой проблемой и не понимаю, почему это вообще может быть проблемой. У меня есть хлебные крошки в верхней части страницы, когда вы нажимаете одну из хлебных крошек (кнопок ссылок), страница бомбит с той же ошибкой («Потенциально опасное значение Request.Form ...»). Я в замешательстве, почему это произошло. Кнопки ссылок просто отправляют форму и отправляют страницу обратно на себя — кнопка отправки делает то же самое. Так почему же кнопка отправки работает правильно, а кнопки ссылок для хлебных крошек — нет?

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

Мысли?


person Mark    schedule 17.02.2010    source источник
comment
Ваш вопрос немного сбивает с толку. Какую функцию вы включили в web.config и как? Что именно он делает с вашим вводом, и пробовали ли вы способы обойти это?   -  person Tim Yates    schedule 17.02.2010
comment
Что значит не получилось? Что случилось?   -  person womp    schedule 17.02.2010
comment
Каким HTML-редактором вы пользуетесь? Если это CKEditor, посмотрите здесь: cksource.com/forums/viewtopic.php? f=5&t=288   -  person Greg    schedule 17.02.2010
comment
Это действительно CKEditor - хороший звонок, Грег :) Этот пост, к сожалению, не слишком помогает моему делу, поскольку предлагаемые решения требуют редактирования web.config или настройки редактора для html-кодирования вывода, что противоречит цели редактора. Я попытался сообщить редактору HTMLEncode содержимое при отправке, а затем html-декодирование результатов перед вставкой/обновлением базы данных, но это не сработало, содержимое все еще закодировано.   -  person Mark    schedule 17.02.2010
comment
Я видел, как кнопка сохранения, встроенная в CKEditor, вызывает эту ошибку в программном обеспечении с открытым исходным кодом NopCommerce, но у них также есть кнопка «Сохранить» на странице, которая работает. Хотя я не уверен, как это работает.   -  person Greg    schedule 18.02.2010
comment
@greg Гм, ну, я думаю, что понял, ПОЧЕМУ это происходит, но я не уверен, как это решить. Ну, я - я должен редактировать сам CKEditor. На самом деле мне также нужно отредактировать его для браузера изображений. Я думаю, что происходит то, что свойство «htmlEncodeOutput» ищет на странице кнопку «отправить» и прикрепляет к ней событие click, которое вызывает html-кодирование экземпляра редактора. Однако все на странице отправляет форму в .net, поэтому LinkButtons и тому подобное не кодируют содержимое, а кнопка отправки кодирует. Вероятно, то же самое и с ситуацией, которую вы описываете.   -  person Mark    schedule 19.02.2010


Ответы (3)


Я установил для ValidateRequest значение false, и это сработало для меня... Вот что рекомендует Microsoft: http://www.asp.net/learn/whitepapers/request-validation/. Если вы используете VS, может быть, попробовать очистить и восстановить?

Я обычно делаю это в директиве @Page, а не в конфигурационном файле, но вы первый, кто услышал, что это не работает...

person Brian Mains    schedule 17.02.2010
comment
Да, это очень странно... это должно работать по всем пунктам, но это не так. Кроме того, я надеялся на лучшее решение, чем отключение проверки, поскольку у нее есть свои очевидные цели. - person Mark; 17.02.2010
comment
Я не знаю лучшего решения, о котором я знаю, из того, что я видел по этому вопросу от других. Может быть неправильно, но из того, что я видел, вы должны сделать это или выполнить кодирование/декодирование JavaScript. - person Brian Mains; 17.02.2010

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

  1. В пуле приложений есть копия .dll в памяти, которая не соответствует html-части страницы.
  2. Если вы используете cassini, прекратите отладку, остановите серверный процесс cassini, очистите решение и перестройте его.
  3. Если вы столкнулись с этим на удаленном сервере, перезапустите пул приложений, очистите кэш страниц и повторите попытку.
  4. Возможно, что временные файлы asp.net невозможно перезаписать после повторного использования или перестроения.
  5. Если вы находитесь на удаленном сервере, остановите веб-сайт, остановите пул приложений. Перейдите в соответствующий каталог временных файлов ASP.Net и удалите папку для своего приложения.
  6. Если вы находитесь на сервере cassini, прекратите отладку, остановите процесс сервера cassini и закройте VS. Затем перейдите к временным файлам ASP.Net и удалите их все. Перезагрузите VS, очистите/соберите. Попробуй снова.
person Joel Etherton    schedule 17.02.2010
comment
Я уже знаю истинную причину проблемы. Причина проблемы именно в том, что мне говорит .net — я пытаюсь отправить потенциально вредоносный контент. Редактор HTML создает разметку и вставляет ее в текстовое поле — форма отправляется, и .net это не нравится, потому что содержимое потенциально вредоносно — и это на 100% правильно, однако в этом случае я действительно намереваюсь отправлять потенциально вредоносный контент и, следовательно, необходимо отключить проверку безопасности .net - проблема в том, что мне нужно делать это на постраничной основе, а не глобально в web.config - person Mark; 17.02.2010
comment
@Марк: А, понятно. Включена ли проверка для других элементов управления? - person Joel Etherton; 17.02.2010
comment
Я не думал, что вы можете сделать это на основе контроль за контролем, если вы об этом спрашиваете? У меня просто есть настройка по умолчанию, которая представляет собой нормальную глобальную проверку безопасности отправки формы .net - мне нужно иметь возможность отключать ее на постраничной основе (например: только страницы, которые используют редактор), но я не могу для какая-то странная причина ... я могу отключить его только глобально, что открывает поля на платформе, которые я не хочу раскрывать. - person Mark; 18.02.2010
comment
@Mark: Нет, я имею в виду, если у вас есть пользовательские валидаторы и CausesValidation=true для отдельных элементов управления. Я видел случаи, когда (я не знаю причины) эти валидаторы отменяли настройку ValidateRequest. - person Joel Etherton; 18.02.2010
comment
Вау, это странно .. Я никогда не видел, чтобы это происходило, но на самом деле у меня вообще нет CausesValidation ни в каких полях. - person Mark; 19.02.2010
comment
@Mark: это полная страница aspx или часть пользовательского элемента управления на странице (или даже главная страница)? - person Joel Etherton; 19.02.2010

Вот трюк jQuery для кодирования значения поля, в данном случае "textarea"

            $("textarea").each(function(i) {
                var $textbox = $(this);
                $textbox.val($('<div/>').text($textbox.val()).html());
            });
person epitka    schedule 18.03.2010