Как указано в других ответах, использование проверок реферера само по себе недостаточно, и вам действительно следует использовать токены против подделки.
Однако, как указал @jeffsix, вы можете использовать проверки реферера в качестве стратегии защиты в глубине (DID), поэтому злоумышленнику потребуется одолеть несколько независимых защит для успешной атаки.
Атрибут ValidateReferrerAttribute, приведенный ниже, можно использовать в действиях HttpPost MVC. Если реферер нулевой, он ничего не делает. Если реферер не равен нулю, он проверяет, что он равен указанному имени хоста. Вам просто нужно добавить его везде, где вы уже используете атрибут ValidateAntiForgeryTokenAttribute, поэтому его будет очень легко добавить.
/// <summary>
/// For POST requests, checks that the requests referrer is the current site. This could be used along side the ValidateAntiForgeryToken
/// Note that many clients do not send the referrer, so we do nothing in this case.
/// This attribute can be used as part of a Defence-in-Depth (DID) strategy, so an
/// attacker would need to defeat multiple, independent, defenses to execute a successful attack.
/// </summary>
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public class ValidateReferrerAttribute : FilterAttribute, IAuthorizationFilter
{
/// <summary>
/// Called when authorization is required.
/// </summary>
/// <param name="filterContext">The filter context.</param>
/// <exception cref="System.ArgumentNullException">filterContext</exception>
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if ((filterContext.HttpContext.Request.UrlReferrer != null) &&
string.Equals(filterContext.HttpContext.Request.HttpMethod, "POST", StringComparison.OrdinalIgnoreCase) &&
!string.Equals(filterContext.HttpContext.Request.UrlReferrer.Host, filterContext.HttpContext.Request.Url.Host, StringComparison.OrdinalIgnoreCase))
{
this.HandleExternalPostRequest(filterContext);
}
}
/// <summary>
/// Handles post requests that are made from an external source.
/// By default a 403 Forbidden response is returned.
/// </summary>
/// <param name="filterContext">The filter context.</param>
/// <exception cref="System.Web.HttpException">Request not allowed.</exception>
protected virtual void HandleExternalPostRequest(AuthorizationContext filterContext)
{
throw new HttpException((int)HttpStatusCode.Forbidden, "Request not allowed.");
}
}