【发布时间】:2013-01-03 13:17:30
【问题描述】:
范围:
我正在开发一个 C# 应用程序来模拟对this site 的查询。我非常熟悉模拟 Web 请求以实现相同的人工步骤,但使用代码代替。
如果您想亲自尝试,只需在 CNPJ 框中输入此数字即可:
08775724000119 并输入验证码并点击Confirmar
我已经处理了验证码,所以不再是问题了。
问题:
一旦我对“CNPJ”执行 POST 请求,就会引发异常:
远程服务器返回错误:(403) Forbidden。
Fiddler 调试器输出:
这是我的浏览器产生的请求,而不是我的代码
POST https://www.sefaz.rr.gov.br/sintegra/servlet/hwsintco HTTP/1.1
Host: www.sefaz.rr.gov.br
Connection: keep-alive
Content-Length: 208
Cache-Control: max-age=0
Origin: https://www.sefaz.rr.gov.br
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: https://www.sefaz.rr.gov.br/sintegra/servlet/hwsintco
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: GX_SESSION_ID=gGUYxyut5XRAijm0Fx9ou7WnXbVGuUYoYTIKtnDydVM%3D; JSESSIONID=OVuuMFCgQv9k2b3fGyHjSZ9a.undefined
// PostData :
_EventName=E%27CONFIRMAR%27.&_EventGridId=&_EventRowId=&_MSG=&_CONINSEST=&_CONINSESTG=08775724000119&cfield=rice&_VALIDATIONRESULT=1&BUTTON1=Confirmar&sCallerURL=http%3A%2F%2Fwww.sintegra.gov.br%2Fnew_bv.html
使用的代码示例和参考:
我正在使用自行开发的库来处理/包装 Post 和 Get 请求。
请求对象具有与浏览器发出的相同参数(Host、Origin、Referer、Cookies..)(在此处登录我的提琴手)。
我还设法使用以下方法设置了 ServicePointValidator 证书:
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback (delegate { return true; });
在所有这些配置之后,我仍然得到禁止的异常。
这是我如何模拟请求并引发异常
try
{
this.Referer = Consts.REFERER;
// PARAMETERS: URL, POST DATA, ThrownException (bool)
response = Post (Consts.QUERYURL, postData, true);
}
catch (Exception ex)
{
string s = ex.Message;
}
提前感谢您对我的问题的任何帮助/解决方案
更新 1:
我错过了生成 cookie 的主页请求(感谢 @W0lf 指出)
现在还有一件奇怪的事情。 Fiddler 没有在请求中显示我的 Cookie,但它们在这里:
【问题讨论】:
-
多么糟糕的验证码系统!
-
你能发布你用来构建请求的所有代码吗?上面的 Fiddler 数据是针对您的程序生成的请求,还是来自浏览器的请求?
-
@W0lf 浏览器发出的请求。我想有一个cookie丢失,但我不确定它是在哪里生成的。现在仔细检查一下,如果没有帮助,我会发布代码
-
@W0lf Captcha 验证是通过 Javascript,Pff 完成的。即使是客户端,每个验证码都是由从 1 到 191 的索引生成的,这也很糟糕。这不是动态生成的验证码。 sefaz.rr.gov.br/sintegra/images/images/60.jpg 永远是“债务”字。
-
它不是动态的部分令人惊讶地不是最愚蠢的事情。最糟糕的是验证是在 JS 中完成的。如果您基本上将
cfield=much&_VALIDATIONRESULT=1传递给每个请求,那么您应该没问题。
标签: c# httpwebrequest