Я работаю над повышением безопасности веб-сайта моей компании и хотел создать токен для предотвращения попыток подделки, который можно было бы легко поддерживать, и это то, что я придумал.
public class AntiForgeryToken
{
private readonly string _referenceToken;
public AntiForgeryToken()
{
_referenceToken = Guid.NewGuid().ToString();
}
public string ReferenceToken
{
get { return _referenceToken; }
}
}
В моем базовом классе для моей MasterPage у меня есть HiddenField, обернутый свойством с именем: ReferenceToken
protected virtual void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
InjectToken();
}
ValidateToken();
}
private void InjectToken()
{
var token = ObjectFactory.GetInstance<AntiForgeryToken>();
ReferenceToken = token.ReferenceToken;
}
private void ValidateToken()
{
var token = ObjectFactory.GetInstance<AntiForgeryToken>();
if (ReferenceToken.Equals(token.ReferenceToken, SC.InvariantCultureIgnoreCase))
return;
...do stuff for failed token
}
У меня есть дескриптор StructureMap, хранящий токен внутри сеанса, поэтому он сохраняется для каждого сеанса пользователя, будет ли все это действительной реализацией схемы AntiForgery?
Редактировать: Кажется, в моем вопросе есть некоторая путаница, да, я понимаю, что ASP.NET MVC имеет встроенную схему AntiForgeryToken, этот вопрос явно о том, как воссоздать это для WebForms для предотвращения использования атаки CSRF (подделка межсайтовых запросов). Я так понимаю, это никоим образом не отменяет необходимости правильной авторизации прав пользователя.
Я собирался привести ту самую ссылку, которую разместили @Neal и @solairaja: Предотвратите подделку межсайтовых запросов (CSRF) с помощью помощника AntiForgeryToken() ASP.NET MVC. В этой статье объясняется больше о том, что такое CSRF-атака и как MVC останавливает ее, однако их решение неприменимо к веб-формам, поэтому я решил реализовать свое собственное.
Увидев ответ @Neal, я думаю, что это, скорее всего, будет принятым ответом, поскольку я не осознавал, что могу просто получить фактический исходный код из инструмента MVC, который, скорее всего, заменит создание руководства. Но я оставлю вопрос открытым, если у кого-то еще есть ценная информация для добавления.