【问题标题】:C# WebRequest - HTTP: 403 Forbidden ('_xsrf' argument missing from POST)C# WebRequest - HTTP:403 Forbidden(POST 中缺少“_xsrf”参数)
【发布时间】:2018-01-17 09:06:47
【问题描述】:

我被困在这里从HTTPWebRequest 获得WebResponse

WebRequest.GetResponse() 方法抛出 WebException ("500 Internal Server Error")。当我阅读返回的 HTML 时,它说:

HTTP 403:禁止(POST 中缺少“_xsrf”参数)

任何人都知道这个错误或知道我做错了什么?

(我正在尝试使用 POST 登录网站)

编辑: 我的源代码:

      private String GetLoginCookies(String pHTTPurl, String pUserIDwithFormID, String pPasswordWithFormID)
  {
     String loginPageUrl = pHTTPurl;
     CookieContainer cookieContainer = new CookieContainer();
     var Request = (HttpWebRequest)WebRequest.Create(loginPageUrl);
     Request.CookieContainer = cookieContainer;
     Request.Method = "GET";

     WebResponse Response = Request.GetResponse();

     HttpWebResponse HttpResponse = Response as HttpWebResponse;

     CookieCollection cookies = null;
     if (HttpResponse != null)
     {
        //Cookies die benötigt werden um den Loginvorgang abzuschließen
        cookies = HttpResponse.Cookies;
     }

     string formParams = string.Format(pUserIDwithFormID + "&" + pPasswordWithFormID);


     Request = (HttpWebRequest)WebRequest.Create(loginPageUrl);
     Request.CookieContainer = cookieContainer;
     Request.UserAgent = "I am not a Bot! Ok maybe..";
     WebResponse resp = null;
     Request.ContentType = "application/x-www-form-urlencoded";
     Request.Method = "POST";
     byte[] bytes = Encoding.ASCII.GetBytes(formParams);
     Request.ContentLength = bytes.Length;
     using (Stream os = Request.GetRequestStream())
     {
        os.Write(bytes, 0, bytes.Length);
     }
     try
     {
        resp = Request.GetResponse();
        using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
        {
           String TestResponse = sr.ReadToEnd();
        }
     }
     catch (WebException WE)
     {
        DebugConsole.AppendText("HTTP Error:" + WE.Message + Environment.NewLine);
        String HTML = new StreamReader(WE.Response.GetResponseStream()).ReadToEnd();
        DebugConsole.AppendText(HTML);
        return null;
     }
     String cookieHeader = resp.Headers["Set-cookie"];
     if (String.IsNullOrEmpty(cookieHeader))
        return null;
     else
        return cookieHeader;
  }

【问题讨论】:

标签: c# http csrf webrequest


【解决方案1】:

这实际上是因为web方法需要anti csrf(跨站请求伪造,更多信息在这里:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF))验证参数。您可以做的是将 csrf 值附加到请求标头:

postHeaders.Add("X-CSRFToken", CSRF);

如果您需要任何帮助,也许您可​​以在此处粘贴您的源代码,以便我们照顾它

【讨论】:

    【解决方案2】:

    好的!找到解决方案!

    得到登录站点的响应后,在"Set-cookie" Header 中搜索_xsrf。这是您必须放入下一个 POST 请求的标头中的 Token。

    【讨论】:

    • 非常好!!对不起,我没有回复你,没有在线。如果我的回答对您有所帮助,您可以将其作为答案:)
    • 没问题。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    相关资源
    最近更新 更多