Как защитить от вмешательства строки запроса?

Hii,

У меня есть строка запроса как "http://project/page1.aspx?userID=5". Операция не будет выполнена, если параметр 'идентификатора пользователя', измененный вручную. Как это возможно?

8
задан Jibu P C_Adoor 11 May 2010 в 09:16
поделиться

7 ответов

Привет всем, спасибо за помощь... и я получил несколько различных решений с других сайтов. я не знаю, что лучшее решение. это кодировать значение с помощью алгоритма шифрования и дешифрования... Пример кода был написан следующим образом...

<a href='Page1.aspx?UserID=<%= HttpUtility.UrlEncode(TamperProofStringEncode("5","F44fggjj")) %>'>
        Click Here</a> <!--Created one anchor tag and call the function for TamperProofStringEncode-->


    
 private string TamperProofStringEncode(string value, string key)
 {
            System.Security.Cryptography.MACTripleDES mac3des = new    System.Security.Cryptography.MACTripleDES();
            System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            mac3des.Key = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key));
            return Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(value)) + "-" + Convert.ToBase64String(mac3des.ComputeHash(System.Text.Encoding.UTF8.GetBytes(value)));
        }


В загрузке страницы 'Page1' вызываем алгоритм декодирования для декодирования строки запроса

try
        {
            string DataString = TamperProofStringDecode(Request.QueryString["UserID"], "F44fggjj");
            Response.Write(DataString);
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }

private string TamperProofStringDecode(string value, string key)
    {
        string dataValue = "";
        string calcHash = "";
        string storedHash = "";

        System.Security.Cryptography.MACTripleDES mac3des = new System.Security.Cryptography.MACTripleDES();
        System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
        mac3des.Key = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(key));

        try
        {
            dataValue = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(value.Split('-')[0]));
            storedHash = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(value.Split('-')[1]));
            calcHash = System.Text.Encoding.UTF8.GetString(mac3des.ComputeHash(System.Text.Encoding.UTF8.GetBytes(dataValue)));

            if (storedHash != calcHash)
            {
                //'Data was corrupted
                throw new ArgumentException("Hash value does not match");
                //  'This error is immediately caught below

            }
        }
        catch (Exception ex)
        {
            throw new ArgumentException("Invalid TamperProofString");
        }

        return dataValue;

    } 
4
ответ дан 5 December 2019 в 10:01
поделиться

Мне больше всего нравится следующее. Он использует модуль HTTP для прозрачного кодирования и декодирования строки запроса с явной целью предотвращения подделки строки запроса.

http://www.mvps.org/emorcillo/en/code/aspnet/qse.shtml

Идеально, когда сеанс не подходит!

2
ответ дан 5 December 2019 в 10:01
поделиться

Вы не можете.

Все в HTTP-запросе (включая URL, строку запроса, cookies, ...) находится под контролем клиента и легко подделывается.

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

3
ответ дан 5 December 2019 в 10:01
поделиться

Ну - это зависит :)

Одна из возможностей - поместить userID в переменную сессии. Таким образом, пользователь не сможет увидеть или отредактировать значение.

Если у вас есть другие способы определить, что значение недействительно (т.е. не существует или не может быть для данного пользователя (которого вы можете идентифицировать другим способом) или т.п.), вы можете обойтись без проверки ввода самостоятельно в коде.

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

0
ответ дан 5 December 2019 в 10:01
поделиться

Это звучит как странное требование. Вы пытаетесь реализовать какую-то собственную систему безопасности? Если это так, то вам действительно не стоит этого делать.

В любом случае, один из способов сделать это - взять весь url http://project/page1.aspx?userID=5 и вычислить его md5-сумму. Затем вы добавляете сумму md5 к конечному url, например http://project/page1.aspx?userID=5&checksum=YOURCALCULATEDMD5SUM. Затем в page1.aspx вы должны будете проверить правильность параметра контрольной суммы.

Однако этот подход довольно наивен, и никому не понадобится много времени, чтобы понять, какой алгоритм вы использовали. Если бы они это сделали, они могли бы "легко" изменить userid и самостоятельно вычислить сумму md5. Более надежным был бы подход, при котором контрольная сумма шифровалась бы ключом, доступ к которому был бы только у вас. Но опять же, я должен поставить под сомнение мотив вашего желания сделать это, потому что существуют другие решения безопасности, которые намного лучше.

3
ответ дан 5 December 2019 в 10:01
поделиться

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

1
ответ дан 5 December 2019 в 10:01
поделиться

Если пользователю разрешено изменять запись 5, но, например, не запись 7, это должно быть реализовано на стороне сервера. Для этого вам нужно иметь возможность идентифицировать пользователя, требуя его входа в систему и предоставляя ему уникальный ключ сессии, который хранится в cookie браузера или в качестве другого параметра в строке запроса url.

Существует множество пакетов/модулей/библиотек в man-языках для разумной работы с аутентификацией и сессиями - используйте их на свой страх и риск :)

.
1
ответ дан 5 December 2019 в 10:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: