Ajax POST是一种可以接受的更改服务器状态的技术吗?

Ajax POST是一种可以接受的更改服务器状态的技术吗?,ajax,asp.net-mvc,security,http,http-post,Ajax,Asp.net Mvc,Security,Http,Http Post,我正在设计一个新网站,我正在考虑使用AJAX post请求来获得更好的用户体验。使用AJAX POST请求更改服务器状态是一种可接受的设计实践吗?他们在使用AJAXPOST请求时是否存在任何安全问题?是否建议仅将服务器状态更改限制为HTTPPOST 编辑 我使用ASP.NET MVC web framework进行实现。Post、Put、Patch和Delete(尽管最后一种几乎不使用)都是传统上改变服务器状态的请求类型 P>为了回答您的问题,考虑使用哪种框架是很重要的,因为每个框架可能有不同

我正在设计一个新网站,我正在考虑使用AJAX post请求来获得更好的用户体验。使用AJAX POST请求更改服务器状态是一种可接受的设计实践吗?他们在使用AJAXPOST请求时是否存在任何安全问题?是否建议仅将服务器状态更改限制为HTTPPOST

编辑


我使用ASP.NET MVC web framework进行实现。

Post、Put、Patch和Delete(尽管最后一种几乎不使用)都是传统上改变服务器状态的请求类型

<> P>为了回答您的问题,考虑使用哪种框架是很重要的,因为每个框架可能有不同的最佳实践。p>
从技术角度看,它们实际上都是一样的,只是语义和约定不同而已。如果你什么都使用Post,我怀疑有人会抱怨Post、Put、Patch和Delete(尽管最后一个几乎没有使用)都是传统上改变服务器状态的请求类型

<> P>为了回答您的问题,考虑使用哪种框架是很重要的,因为每个框架可能有不同的最佳实践。p>
从技术角度看,它们实际上都是一样的,只是语义和约定不同而已。如果你什么都用Post,我怀疑有人会抱怨,Post back是在web应用程序上做事情的传统方式,在表单提交时重新加载整个页面。在这种方法中,大多数代码在服务器端运行

AJAX是构建web应用程序的一种现代方法,其中大部分代码在客户端运行,以获得更好的性能和用户体验。只需要将所需数据发布到服务器,而不是发布整个页面。 Post-back和Ajax都创建了HTTP请求,所以说其中一个不如另一个安全是不对的。在这两种请求中,攻击者都可以使用跨站点脚本(XSS)或CSRF(跨站点请求伪造)注入脚本。 AJAX当CORS被禁用并且JSONP请求被阻止时,调用本身就是使用“公共源策略”来保护CSRF的。为了提前一步防止CSRF攻击,您可以像在MVC框架中一样实现防伪令牌。AJAX调用既可以从web应用程序调用,也可以从MVC调用

MVC中,可以在表单加载时调用@html.antiforgerytoken(),表单加载将一个键存储在隐藏字段中,另一个键存储在cookie中,并使用ValidateAntiForgeryToken过滤器,我们可以验证该CSRF令牌。表单标记对于AJAX请求来说可能是个问题,因为AJAX请求可能发送JSON数据,而不是HTML表单数据。一种解决方案是在自定义HTTP头中发送令牌。 以下是示例代码片段以了解更多详细信息

生成防伪令牌的服务器端代码示例

/// <summary>
/// Get Anti Forgery token
/// </summary>
/// <returns></returns>
public static string GetAntiXsrfToken()
        {
            string cookieToken, formToken;
            AntiForgery.GetTokens(null, out cookieToken, out formToken);
            var responseCookie = new HttpCookie("__AntiXsrfToken")
            {
                HttpOnly = true,
                Value = cookieToken
            };
            if (FormsAuthentication.RequireSSL &&      HttpContext.Current.Request.IsSecureConnection)
            {
                responseCookie.Secure = true;
            }
            HttpContext.Current.Response.Cookies.Set(responseCookie);

            return formToken;
        }
    /// <summary>
    /// Validate Anti Forgery token coming from secure cookie & request header
    /// </summary>
    static void ValidateAntiXsrfToken()
    {
         string tokenHeader, tokenCookie;
         try
         {
// get header token                    
tokenHeader = HttpContext.Current.Request.Headers.Get("__RequestVerificationToken");

                    // get cookie token
                    var requestCookie = HttpContext.Current.Request.Cookies["__AntiXsrfToken"];
                    tokenCookie = requestCookie.Value;

                    AntiForgery.Validate(tokenCookie, tokenHeader);
                }
                catch
                {
                    HttpContext.Current.Response.Clear();
                    HttpContext.Current.Response.StatusCode = 403;
                    HttpContext.Current.Response.End();
                }
            }
最后,在服务器端处理每个AJAX请求之前,调用ValidateAntiXsrfToken()函数

你可以在这里找到更多细节


回帖是在web应用程序上进行操作的传统方式,在表单提交时重新加载整个页面。在这种方法中,大多数代码在服务器端运行

AJAX是构建web应用程序的一种现代方法,其中大部分代码在客户端运行,以获得更好的性能和用户体验。只需要将所需数据发布到服务器,而不是发布整个页面。 Post-back和Ajax都创建了HTTP请求,所以说其中一个不如另一个安全是不对的。在这两种请求中,攻击者都可以使用跨站点脚本(XSS)或CSRF(跨站点请求伪造)注入脚本。 AJAX当CORS被禁用并且JSONP请求被阻止时,调用本身就是使用“公共源策略”来保护CSRF的。为了提前一步防止CSRF攻击,您可以像在MVC框架中一样实现防伪令牌。AJAX调用既可以从web应用程序调用,也可以从MVC调用

MVC中,可以在表单加载时调用@html.antiforgerytoken(),表单加载将一个键存储在隐藏字段中,另一个键存储在cookie中,并使用ValidateAntiForgeryToken过滤器,我们可以验证该CSRF令牌。表单标记对于AJAX请求来说可能是个问题,因为AJAX请求可能发送JSON数据,而不是HTML表单数据。一种解决方案是在自定义HTTP头中发送令牌。 以下是示例代码片段以了解更多详细信息

生成防伪令牌的服务器端代码示例

/// <summary>
/// Get Anti Forgery token
/// </summary>
/// <returns></returns>
public static string GetAntiXsrfToken()
        {
            string cookieToken, formToken;
            AntiForgery.GetTokens(null, out cookieToken, out formToken);
            var responseCookie = new HttpCookie("__AntiXsrfToken")
            {
                HttpOnly = true,
                Value = cookieToken
            };
            if (FormsAuthentication.RequireSSL &&      HttpContext.Current.Request.IsSecureConnection)
            {
                responseCookie.Secure = true;
            }
            HttpContext.Current.Response.Cookies.Set(responseCookie);

            return formToken;
        }
    /// <summary>
    /// Validate Anti Forgery token coming from secure cookie & request header
    /// </summary>
    static void ValidateAntiXsrfToken()
    {
         string tokenHeader, tokenCookie;
         try
         {
// get header token                    
tokenHeader = HttpContext.Current.Request.Headers.Get("__RequestVerificationToken");

                    // get cookie token
                    var requestCookie = HttpContext.Current.Request.Cookies["__AntiXsrfToken"];
                    tokenCookie = requestCookie.Value;

                    AntiForgery.Validate(tokenCookie, tokenHeader);
                }
                catch
                {
                    HttpContext.Current.Response.Clear();
                    HttpContext.Current.Response.StatusCode = 403;
                    HttpContext.Current.Response.End();
                }
            }
最后,在服务器端处理每个AJAX请求之前,调用ValidateAntiXsrfToken()函数

你可以在这里找到更多细节


谢谢你的回答。我排除了这个信息,认为它不相关,但我现在更新了这个问题。我的问题不是关于GET vs POST。这是关于HTTP POST和AJAX POST的,这是一样的,两者都是通过HTTP协议的请求。Ajax只是一种技术(其中请求由脚本语言启动),而不是一种协议。谢谢您的回答。我排除了这个信息,认为它不相关,但我现在更新了这个问题。我的问题不是关于GET vs POST。这是关于HTTP POST和AJAX POST的,这是一样的,两者都是通过HTTP协议的请求。Ajax只是一种技术(其中请求由脚本语言启动),而不是一种协议。