HttpModule для шифрования строк запроса

Я нашел этот замечательный маленький HttpModule, который шифрует и расшифровывает все строки запроса. Его можно найти здесь: HttpModule для шифрования строки запроса

Есть один серьезный недостаток, который я действительно мог бы использовать для решения. При обратной передаче страницы POST HttpMethod пропускается, а QueryString отображается в расшифрованном виде. Очевидно, это серьезная угроза безопасности.

void context_BeginRequest(object sender, EventArgs e)
{
    try
    {
        HttpContext context = HttpContext.Current;
        if (context.Request.Url.OriginalString.Contains("aspx") && context.Request.RawUrl.Contains("?"))
        {
            string query = ExtractQuery(context.Request.RawUrl);
            string path = GetVirtualPath();

            if (query.StartsWith(PARAMETER_NAME, StringComparison.OrdinalIgnoreCase))
            {
                // Decrypts the query string and rewrites the path.
                string rawQuery = query.Replace(PARAMETER_NAME, string.Empty);
                string decryptedQuery = Decrypt(rawQuery);
                context.RewritePath(path, string.Empty, decryptedQuery);
            }
            else if (context.Request.HttpMethod == "GET")
            {
                // Encrypt the query string and redirects to the encrypted URL.
                // Remove if you don't want all query strings to be encrypted automatically.
                string encryptedQuery = Encrypt(query);
                context.Response.Redirect(path + encryptedQuery);
            }
        }
    }
    catch (ThreadAbortException)
    {
        //do nothing. let it pass
    }
    catch (Exception exc)
    {
        ReportError(exc);
    }
}

Я пробовал добавить добавление if catch для метода POST:

            else if (context.Request.HttpMethod == "POST")
            {
                if (!query.StartsWith(PARAMETER_NAME, StringComparison.OrdinalIgnoreCase))
                {
                    string encryptedQuery = Encrypt(query);
                    context.Response.Redirect(path + encryptedQuery);
                }
            }

Однако это перезагружает страницу из-за Response.Redirect, и поэтому PostBack бесполезен.

Есть ли у кого-нибудь идеи или есть ли способ определить, является ли HttpContext PostBack?


person Nugs    schedule 01.12.2011    source источник
comment
Это не очень полезно; строка запроса в виде открытого текста по-прежнему будет передаваться по сети в открытом виде. Чего вы боитесь? Почему в строке запроса содержится конфиденциальная информация?   -  person SLaks    schedule 02.12.2011
comment
Шифрование строки запроса бесполезно. Вместо этого используйте Session и / или ssl.   -  person Klaus Byskov Pedersen    schedule 02.12.2011
comment
Это не столько конфиденциальные данные, сколько я не хочу, чтобы люди напрямую изменяли строку запроса.   -  person Nugs    schedule 02.12.2011
comment
@Nugs, что намеренно загромождает сеть. Это напоминает мне времена, когда некоторые веб-сайты создавались полностью на Flash, поэтому вы никогда не могли использовать адресную строку и перейти на желаемую страницу сайта.   -  person    schedule 02.12.2011
comment
@Nugs - лучше рассматривать строку запроса как часть схемы публичной адресации вашего веб-сайта. Не пытайтесь скрыть это, лучше позвольте людям воспользоваться этим, чтобы использовать ваш сайт с максимальной отдачей. Если вы действительно опасаетесь, что ручные манипуляции со строкой запроса могут каким-либо образом навредить вашему сайту, это говорит о том, что вам нужно поработать, чтобы удалить такие уязвимости.   -  person Adam Ralph    schedule 02.12.2011
comment
@Inuyasha Шифрование строки запроса не мешает моим пользователям использовать адрес для создания закладок и перехода на эти страницы приложения в любое время.   -  person Nugs    schedule 02.12.2011
comment
@AdamRalph: Может быть, ты прав. Я бы не назвал их уязвимостями, я просто решил убедиться, что мои пользователи не пытаются перемещаться по моему приложению, манипулируя значениями / идентификаторами строки запроса. Я видел, как шифрование строки запроса выполнялось много раз ...   -  person Nugs    schedule 02.12.2011
comment
@Nugs, почему бы не разрешить вашим пользователям перемещаться по сайту, манипулируя строкой запроса? Это сделает ваш сайт более полезным. Если они не сделают этого, ваш сайт станет менее удобным для использования.   -  person Adam Ralph    schedule 02.12.2011


Ответы (1)


Отправка конфиденциальных данных в строке запроса - не лучшая идея. Если вам нужно, то лучше зашифровать данные перед построением вашей строки запроса, чем шифровать всю строку запроса. Также ваш сайт не должен быть скомпрометирован пользователем, изменяющим строку запроса. URI направляет пользователя туда, куда он хочет перейти, поэтому навигация путем изменения строки запроса (URI) является стандартом для Интернета. Интернет должен быть RestFul.

person Dai-Viet Au    schedule 02.12.2011