【问题标题】:Post to form in C# - pass antiforgerytoken在 C# 中发布到表单 - 传递 antiforgerytoken
【发布时间】:2014-06-30 02:33:13
【问题描述】:

我正在尝试通过我的 C# 应用程序发布一个表单。

我的问题是给定的令牌无效,发帖失败。

当我查看浏览器并阅读 GET 响应时,它会给出正确的令牌。我试图在我的应用程序中做同样的事情,但由于某种原因,我得到的渲染令牌无效。

我想从服务器获取第一个实际获取以获取第一个表单数据。我做错了吗?

   HttpWebRequest req = (HttpWebRequest)WebRequest.Create(linkToArticle);

   req.Credentials = CredentialCache.DefaultCredentials;
   HttpWebResponse response = (HttpWebResponse)req.GetResponse();

   Stream receiveStream = response.GetResponseStream();

   StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);

   string rawHtml = readStream.ReadToEnd();
   string token = getToken(rawHtml);
   response.Close();
   readStream.Close();

    var loginData = new NameValueCollection();
    loginData.Add("__RequestVerificationToken", token);
    loginData.Add("cbTerms", "on");
    Console.WriteLine("token: "+ token);
    Console.WriteLine("id: "+ id);


    client.UploadValues("/Form/?aid="+id, "POST", loginData);

【问题讨论】:

  • 这个函数只解析它。你用什么发帖?
  • 其他标头的代码呢?我的意思是 CSRF 保护的 cookie 部分...
  • 请注意,cookie 和表单标记值实际上是不同的,但形成了不应混淆的匹配对。您需要发回 cookie 值以及表单值。您没有显示您的 getToken() 函数,但大概只是解析表单值?

标签: c# antiforgerytoken


【解决方案1】:

您还需要一个名为 __RequestVerificationToken 的 cookie,其中包含令牌值。这样可以确保发布表单的用户是显示表单的用户。

您可以在本文中阅读有关该过程的更多信息: http://blog.stevensanderson.com/2008/09/01/prevent-cross-site-request-forgery-csrf-using-aspnet-mvcs-antiforgerytoken-helper/

这篇文章展示了如何实现你想要的:

http://adam.kahtava.com/journal/2009/11/25/what-are-anti-cross-site-request-forgery-tokens-and-what-are-they-good-for/

【讨论】:

    猜你喜欢
    • 2017-11-21
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多