Как зашифровать и расшифровать cookie в существующем проекте без изменения кода всех страниц - PullRequest
0 голосов
/ 26 сентября 2018

Я работаю над проектом с тысячами страниц, который использует куки.Теперь возникает проблема безопасности, поэтому я планирую зашифровать cookie-файл и расшифровать его при использовании на уровне страницы.

Пример кода, который я использовал на Страница входа , где создается мой cookie-файл,как показано ниже:

Response.Cookies.Clear()
Response.Cookies("userinfo")("username") = "Pravin Kumar"
Response.Redirect("Home.aspx")

Теперь я хочу получить доступ к этому cookie на моей HOME.aspx странице.Код выглядит следующим образом.

Response.Write(Request.Cookies("userinfo")("username"))

Так работают страницы моего проекта до сих пор, и это позволяет пользователю просматривать файлы cookie в окне браузера, как показано ниже: Browser Cookie

Теперь я хочу сделать шифрование на странице LOGIN.aspx и выполнить дешифрование в таком централизованном месте, чтобы мне не нужно было менять все страницы.

PS: я пробовал со страницей GLOBAL.asax использовать

Sub Application_EndRequest(ByVal sender As Object, ByVal e As EventArgs)

End Sub

Но это не помогло. Пожалуйста, предложите мне, если найдется какой-нибудь простой способ.

1 Ответ

0 голосов
/ 26 сентября 2018

вам придется использовать HttpModule для переопределения поведения файлов cookie для чтения / записи.

вот пример кода:

во-первых, в вашем HttpModule

public class CookieEncryptModule : IHttpModule
{
    public void Dispose()
    {

    }

    public void Init(HttpApplication context)
    {
        context.PreSendRequestContent += Context_PreSendRequestContent;
        context.BeginRequest += Context_BeginRequest;
    }

    private void Context_BeginRequest(object sender, EventArgs e)
    {
        HttpApplication httpApplication = sender as HttpApplication;
        for (int i = 0; i < httpApplication.Request.Cookies.Count; i++)
        {
            var cookie = httpApplication.Request.Cookies[i];
            cookie.Value = dencryptCookieValue(cookie.Value);
        }
    }



    private void Context_PreSendRequestContent(object sender, EventArgs e)
    {
        HttpApplication httpApplication = sender as HttpApplication;
        for (int i = 0; i < httpApplication.Response.Cookies.Count; i++)
        {
            var cookie = httpApplication.Response.Cookies[i];
            cookie.Value = encryptCookieValue(cookie.Value);
        }
    }


    private string encryptCookieValue(string value)
    {
        return Convert.ToBase64String(Encoding.UTF8.GetBytes(value));
    }

    private string dencryptCookieValue(string value)
    {
        try
        {
            return Encoding.UTF8.GetString(Convert.FromBase64String(value));
        }
        catch
        {
            //in case some system generated cookies like session id will not be encrypted by our code
            return value;
        }

    }

}

, то в вашем файле web.config

  <system.webServer>
<modules>
  <add name="encryptCookie" type="[your_namespace].CookieEncryptModule, [your_assemably_name]"/>
</modules></system.webServer>

после того, как выше будет выполнено, ваши куки теперь будут храниться в клиенте с base64,

, но для вас серверные коды прозрачны, вы нене нужно ничего менять

[уведомление]: это приведет к тому, что все JS не смогут прочитать значение cookie

...