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

ASP.NET   16 февраля 2013  Автор статьи:  

В этой статье я расскажу, что нужно делать, если вы собираетесь передавать потенциально опасные значения через форму. Данная проблема начала возникать у меня достаточно давно, но давайте полностью обрисую ее. Пусть у вас есть какой — то веб-элемент, в которой пользователь может вводить данные, тогда при отправки формы на сервер происходит валидация всех полей на наличие html разметки или скриптов. Данная проверка защищает вас от большого класса атак, поэтому просто отключить валидацию на всем сайте не есть хорошая идея. Но давайте смоделируем ситуацию возникновения ошибки. Для этого создадим веб-форму Default.aspx и добавим на нее один TextBox и одну кнопку.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>









И конечно добавим на кнопку событие, пусть по нажатию на нее, в переменную text записывается значения TextBox.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}

protected void btnSend_Click(object sender, EventArgs e)
{
string text = tbSend.Text;
}
}
}

Вот теперь мы смоделировали проблему. Запустим наше приложение и попробуем ввести потенциально опасное значение «<a>»:
[warning]Обнаружено потенциально опасное значение Request.Form, полученное от клиента (tbSend=»<a>»).[/warning]
Думаю на такую ошибку вы и натолкнулись.
Посмотрим, что нам советует Microsoft:
[important]Приложение ASP.NET обнаружило в запросе потенциально опасные данные, которые могут содержать разметку или скрипт HTML. Эти данные могут представлять попытку нарушения безопасности приложения, например атаку на основе межсайтовых скриптов. Если этот тип входных данных необходим для работы приложения, можно включить код в веб-страницу, чтобы разрешить его явным образом.[/important]
Таким образом Microsoft предлагает включить код явным образом, а не отключить валидацию на странице, как вы могли увидеть на многих форумах.
Давайте уже перейдем к решению проблемы. Создадим скрипт, который будет экранизировать символы, которые считаются опасными. Я сделал это на основе jquery:



Данная функция заменяет все опасные символы в любом элементе, который имеет class=»myClass». Осталось только повесить вызов функции replaceThemAll() на нажатие кнопки:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>











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

protected void btnSend_Click(object sender, EventArgs e)
{
string text = tbSend.Text.Replace(@"&","&").Replace(@">", ">").Replace(@"<", "<").Replace(@"'", "'").Replace(@""", "\""); }

Надеюсь данная статья помогла вам справится с этой ошибкой.

  • zhelezo

    Млин, я полчаса тупил, пока ошибку не нашел
    ans = ans.replace(/»/g, ‘"’);
    ans = ans.replace(/’/g, ‘'’);
    ans = ans.replace(//g, ‘>’);
    ans = ans.replace(/&/g, ‘&’);

    Амерсанд нужно кодировать ПЕРВЫМ! Иначе ты кодируешь его два раза!

Научиться программировать

  • на Delphi

  • на Java

  • на C++