Знак "=" в значении параметра URL

iConst
Дата: 27.04.2010 12:32:39
Привет всем!

Столкнулся с проблемкой: имелась древняя DBF базочка данных, к которой нужно было прицепиться и выводить на веб-страницу каталог товаров. Всего одна таблица с полями "Тип", "Фирма", "Группа", "Наименование", "Артикул" со всеми вытекающими:
"Канцелярия" "Фирма1" "Аксессуары" "Ежедневник <Access>" "Артикул1"
"Канцелярия" "Фирма1" "Аксессуары" "Ежедневник <Access>" "Артикул2"
"Канцелярия" "Фирма1" "Пишущие принадлежности" "Ручка такая" "Артикул3"
"Канцелярия" "Фирма2" "Пишущие принадлежности" "Ручка сякая" "Артикул4"
"Галантерея" "Фирма1" "Кожание изделия" "Портмоне" "Артикул5"
...

Поскольку она не релятивная, то, чтобы отбирать данные, нужно дергать по содержимому полей.
Все-бы ничего, но, как вы заметили, умненькие "менедьжеры" понатолкали туда, например, таких названий: "Ежедневник <Access>". Естественно запрос типа

catalogue.aspx?type=Канцелярия& ... &name=Ежедневник <Access>&...(!параметры ессно кодированы HttpUtility.UrlEncode, открытым текстом для наглядности)

вызывает возмущение ASP.Net. Отключать проверку не хочется.
Пришлось, чтобы не тормозить, по-быстрому кодировать в Base64. Все работает, но многие строки кодированные таким образом имеют последним знаком "=" или "==".
Например:

catalogue.aspx?type=0Jr...CV0K8=&firm=0KHQl...LQqw==&group=0KHQ... (!кодированные параметры слегка "подрезаны")

ВОПРОС:
Теоретически, может-ли это привести к ошибкам парсинга параметров запроса?
Знак "&", в кодированной по Base64 строке, появиться не может.

Перевернув мир - оглянись, может перевернулся ты сам?!
Зритель с попкорном 5
Дата: 27.04.2010 13:09:47
iConst,

не могли бы Вы привести примеры текста кодированного посредством HttpUtility.UrlEncode, который вызывает возмущение ASP.NET? а то чего-то слабо верится
iConst
Дата: 27.04.2010 13:28:12
Зритель с попкорном 5,
Сейчас возвращать код к ошибке нет возможности: идет работа. Но, поверьте - название "Ежедневник <Access>" взято "один-в-один".
Собственно, на нем и споткнулись при тестинге.

Выяснилось другое - кодировка по Base64 не спасает от проблем! Если в конце кодированной строки появляется +, то при чтении параметра
var _name = Request.QueryString["name"];
он пропадает! :)

Теперь кодируем еще и
HttpUtility.UrlEncode()!

Но это уже о-о-очень не кашерно!!!

Эниван, есть идеи?
Зритель с попкорном 5
Дата: 27.04.2010 13:36:18
iConst,

не верю, UrlEncode от "Ежедневник <Access>" равен "%d0%95%d0%b6%d0%b5%d0%b4%d0%bd%d0%b5%d0%b2%d0%bd%d0%b8%d0%ba+%3cAccess%3e", что в Request.QueryString["name"] возвращает тот же "Ежедневник <Access>", ч.т.д.
iConst
Дата: 27.04.2010 14:11:58
Зритель с попкорном 5,
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="test_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
         <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
         <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    </div>
    </form>
</body>
</html>

public partial class test_Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = Request.QueryString["param"];
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.Redirect("~/test/default.aspx?param=" + HttpUtility.UrlEncode(TextBox1.Text));
    }
}
iConst
Дата: 27.04.2010 14:25:37
Извиняюсь - некорректный пример
Вот другой:

<body>
    <form id="form1" runat="server">
    <div>
         <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
         Result: <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    </div>
    </form>
</body>

public partial class test_Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = Request.QueryString["param"];
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.Redirect("~/test/default.aspx?param=" + HttpUtility.UrlEncode("Ежедневник <Access>"));
    }
}

Итог:
Ошибка сервера в приложении ...
Обнаружено потенциально опасное значение Request.QueryString, полученное от клиента (param="...жедневник <Access>").
Зритель с попкорном 5
Дата: 27.04.2010 15:05:42
iConst,

С кнопкой не получится бо там POST того что есть но суть примерно такова:

	<body>
		<form runat="server">
			<a href="<%= ResolveUrl("~/test/default.aspx?param=" + HttpUtility.UrlEncode(HttpUtility.HtmlEncode("Ежедневник <Access>"))) %>">test</a>
			<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
		</form>
	</body>
	protected void Page_Load(object sender, EventArgs e)
	{
		Label1.Text = HttpUtility.HtmlDecode(Request.QueryString["param"]);
	}
iConst
Дата: 27.04.2010 15:44:50
Зритель с попкорном 5,

-Да, так лучше :) .
Один черт - дважды кодировать.

Сенкс!
Lamer@fools.ua
Дата: 29.04.2010 13:35:15
iConst,

В Web.config:
<pages validateRequest="false">
...
</pages>

?