Hii,
У меня есть строка запроса как "http://project/page1.aspx?userID=5". Операция не будет выполнена, если параметр 'идентификатора пользователя', измененный вручную. Как это возможно?
Привет всем, спасибо за помощь... и я получил несколько различных решений с других сайтов. я не знаю, что лучшее решение. это кодировать значение с помощью алгоритма шифрования и дешифрования... Пример кода был написан следующим образом...
<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;
}
Мне больше всего нравится следующее. Он использует модуль HTTP для прозрачного кодирования и декодирования строки запроса с явной целью предотвращения подделки строки запроса.
http://www.mvps.org/emorcillo/en/code/aspnet/qse.shtml
Идеально, когда сеанс не подходит!
Вы не можете.
Все в HTTP-запросе (включая URL, строку запроса, cookies, ...) находится под контролем клиента и легко подделывается.
Вот почему важно составлять белый список допустимого содержимого, потому что клиент может произвольно добавить все, что захочет, в дополнение к тому, что вы хотите получить.
Ну - это зависит :)
Одна из возможностей - поместить userID
в переменную сессии. Таким образом, пользователь не сможет увидеть или отредактировать значение.
Если у вас есть другие способы определить, что значение недействительно (т.е. не существует или не может быть для данного пользователя (которого вы можете идентифицировать другим способом) или т.п.), вы можете обойтись без проверки ввода самостоятельно в коде.
Но, как вы, вероятно, знаете, вы не можете предотвратить изменение пользователем строки запроса.
Это звучит как странное требование. Вы пытаетесь реализовать какую-то собственную систему безопасности? Если это так, то вам действительно не стоит этого делать.
В любом случае, один из способов сделать это - взять весь url http://project/page1.aspx?userID=5
и вычислить его md5-сумму. Затем вы добавляете сумму md5 к конечному url, например http://project/page1.aspx?userID=5&checksum=YOURCALCULATEDMD5SUM
. Затем в page1.aspx вы должны будете проверить правильность параметра контрольной суммы.
Однако этот подход довольно наивен, и никому не понадобится много времени, чтобы понять, какой алгоритм вы использовали. Если бы они это сделали, они могли бы "легко" изменить userid и самостоятельно вычислить сумму md5. Более надежным был бы подход, при котором контрольная сумма шифровалась бы ключом, доступ к которому был бы только у вас. Но опять же, я должен поставить под сомнение мотив вашего желания сделать это, потому что существуют другие решения безопасности, которые намного лучше.
Вы не можете сказать, была ли она изменена вручную. Если вы используете строки запросов, вы должны убедиться, что не имеет значения, изменен ли он. Например, если вы используете его, чтобы показать пользователю данные его учетной записи, вам нужно проверить, является ли выбранный пользователь текущим пользователем, и показать сообщение об ошибке вместо данных пользователя, если это не так.
Если пользователю разрешено изменять запись 5, но, например, не запись 7, это должно быть реализовано на стороне сервера. Для этого вам нужно иметь возможность идентифицировать пользователя, требуя его входа в систему и предоставляя ему уникальный ключ сессии, который хранится в cookie браузера или в качестве другого параметра в строке запроса url.
Существует множество пакетов/модулей/библиотек в man-языках для разумной работы с аутентификацией и сессиями - используйте их на свой страх и риск :)
.