HttpModule для шифрования строк запросов - PullRequest
0 голосов
/ 02 декабря 2011

Я нашел этот замечательный маленький 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?

1 Ответ

6 голосов
/ 02 декабря 2011

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

...