Как сделать строку запроса защищенной от несанкционированного доступа? - PullRequest
3 голосов
/ 03 декабря 2009

Мне нужно использовать строки запроса в URL, но нужно убедиться, что они не были подделаны. Я нашел решение, которое почти работает , но закодированные строки искажаются службой, которую должно использовать мое приложение. Кто-нибудь может придумать другое решение?

РЕДАКТИРОВАТЬ: Решение, которое я упоминаю, не работает для меня, потому что строка запроса в кодировке Base64 содержит "+". Служба, которой я передаю эту строку запроса, неправильно обрабатывает «+», и я даже не могу URL закодировать ее в «% 2B». Я полагаю, что я могу заменить "_" на это. Однако мне было интересно, было ли совсем другое решение.

РЕДАКТИРОВАТЬ 2: Чтобы быть более ясным, решение, на которое я ссылаюсь, работает, но я задавался вопросом об альтернативных решениях.

Ответы [ 3 ]

4 голосов
/ 03 декабря 2009

вы можете зашифровать значение строки запроса, а затем передать его и, где вы хотите использовать, просто расшифровать его. Также проверьте эти статьи ... как-к-шифровку-строки запроса-параметры-в-Asp-нетто

http://www.codeproject.com/KB/web-security/QueryStringEncryptionNET.aspx

2 голосов
/ 06 ноября 2014

Вы можете вычислить и передать хэш ваших параметров вместе со строкой запроса. На целевой странице снова вычислите хеш и сравните его с хешем строки запроса, если оба они не совпадают, это означает, что URL-адрес был изменен.

Вы можете создавать функции внутри служебного класса, например

const string secretKey = "%%YoUrSeCrEtKeY##";

     public static string CreateTamperProofUrl(string pageUrl)
    {
        try
        {
            return HttpUtility.UrlEncode(CreateDigest(pageUrl.Trim()));
        }
        catch (Exception)
        {
            throw;
        }
    }

    private static string CreateDigest(string pageUrl)
    {
        string urlToEncode = secretKey + pageUrl + secretKey;
        var hasher = new MD5CryptoServiceProvider();
        var encoder = new UTF8Encoding();

        byte[] hashedDataBytes = hasher.ComputeHash(encoder.GetBytes(urlToEncode));
        string signatureData = Convert.ToBase64String(hashedDataBytes);

        return signatureData;
    }

    public static bool IsValidDigest(string pageUrl, string receivedDigest)
    {
        if (receivedDigest == null)
        {
            return false;
        }

        string expectedDigest = CreateDigest(pageUrl);
        if (string.Compare(receivedDigest, expectedDigest) != 0)
        {
            return false;
        }
        else
            return true;
    }

На вашей целевой странице просто отметьте это

    if (!Page.IsPostBack)
        {
            if (Request.QueryString["Digest"] != null)
            {
                // compare the digest
                string id = Request.QueryString["fid"];
                string digest = Request.QueryString["Digest"];

                if (Utility.IsValidDigest(id, digest))
                {
                    lblStatus.ForeColor = System.Drawing.Color.DarkGreen;
                    lblStatus.Text = "Valid digest received";
                }
                else
                {
                    lblStatus.ForeColor = System.Drawing.Color.Red;
                    lblStatus.Text = "Url is tampered!";
                }

            }
   }
2 голосов
/ 03 декабря 2009

В основном дубликат: Безопасность со значениями QueryString в Asp.net MVC

Итог - никогда не доверяйте вводу пользователя, особенно через Интернет, всегда предполагайте, что пользователь может и будет вмешиваться в ввод.

...