- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
范围:
我正在开发一个 C# 应用程序来模拟对 this site 的查询。我非常熟悉模拟 Web 请求以实现相同的人工步骤,但使用代码代替。
如果您想亲自尝试,只需在 CNPJ 框中输入此号码即可:08775724000119
并输入验证码并单击Confirmar
我已经处理了验证码,所以这不再是问题了。
问题:
一旦我执行“CNPJ”的 POST 请求,就会抛出异常:
The remote server returned an error: (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..)(在此处记录了我的 fiddler)。
我还设法使用以下方法设置证书的 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中。
与您的要求唯一不同的是:
sCallerURL
参数的值(我有 sCallerURL=
而不是 sCallerURL=http%3A%2F%2Fwww...
)Accept-Language:
值(我很确定这并不重要)Content-Length
不同(显然)好吧,我以为 Fiddler 跟踪来自您的应用程序。如果您没有根据您的请求设置 cookie,请执行以下操作:
https://www.sefaz.rr.gov.br/sintegra/servlet/hwsintco
发出 GET 请求。如果您检查响应,您会发现网站发送了两个 session Cookie。如果您不知道如何存储 cookie 并在其他请求中使用它们,请查看 here .
好的,我成功地重现了 403,找出了导致它的原因,并找到了修复方法。
POST 请求中发生的情况是:
.NET 的 HttpWebRequest 尝试无缝地执行此重定向,但在这种情况下存在两个问题(我会考虑 .NET 实现中的错误):
POST(重定向)后的 GET 请求与 POST 请求具有相同的内容类型 (application/x-www-form-urlencoded
)。对于 GET 请求,不应指定此值
Cookie 处理问题(最重要的问题) - 网站发送两个 Cookie:GX_SESSION_ID
和 JSESSIONID
。第二个指定了路径 (/sintegra
),而第一个则没有。
区别在于:浏览器默认为第一个 cookie 分配 /
(root) 路径,而 .NET 为其分配请求 url 路径 (/sintegra/servlet/hwsintco
)。
因此,最后一个 GET 请求(重定向后)到 /sintegra/servlet/hwsintpe...
不会获取传入的第一个 cookie,因为它的路径不对应。
为此,请告诉它不要遵循重定向:
postRequest.AllowAutoRedirect = false
然后从 POST 响应中读取重定向位置并手动对其执行 GET 请求。
为此,我发现的修复方法是从 CookieContainer 中取出放错位置的 cookie,正确设置其路径并将其添加回容器中的正确位置。
这是执行此操作的代码:
private void FixMisplacedCookie(CookieContainer cookieContainer)
{
var misplacedCookie = cookieContainer.GetCookies(new Uri(Url))[0];
misplacedCookie.Path = "/"; // instead of "/sintegra/servlet/hwsintco"
//place the cookie in thee right place...
cookieContainer.SetCookies(
new Uri("https://www.sefaz.rr.gov.br/"),
misplacedCookie.ToString());
}
<小时/>
using System;
using System.IO;
using System.Net;
using System.Text;
namespace XYZ
{
public class Crawler
{
const string Url = "https://www.sefaz.rr.gov.br/sintegra/servlet/hwsintco";
public void Crawl()
{
var cookieContainer = new CookieContainer();
/* initial GET Request */
var getRequest = (HttpWebRequest)WebRequest.Create(Url);
getRequest.CookieContainer = cookieContainer;
ReadResponse(getRequest); // nothing to do with this, because captcha is f#@%ing dumb :)
/* POST Request */
var postRequest = (HttpWebRequest)WebRequest.Create(Url);
postRequest.AllowAutoRedirect = false; // we'll do the redirect manually; .NET does it badly
postRequest.CookieContainer = cookieContainer;
postRequest.Method = "POST";
postRequest.ContentType = "application/x-www-form-urlencoded";
var postParameters =
"_EventName=E%27CONFIRMAR%27.&_EventGridId=&_EventRowId=&_MSG=&_CONINSEST=&" +
"_CONINSESTG=08775724000119&cfield=much&_VALIDATIONRESULT=1&BUTTON1=Confirmar&" +
"sCallerURL=";
var bytes = Encoding.UTF8.GetBytes(postParameters);
postRequest.ContentLength = bytes.Length;
using (var requestStream = postRequest.GetRequestStream())
requestStream.Write(bytes, 0, bytes.Length);
var webResponse = postRequest.GetResponse();
ReadResponse(postRequest); // not interested in this either
var redirectLocation = webResponse.Headers[HttpResponseHeader.Location];
var finalGetRequest = (HttpWebRequest)WebRequest.Create(redirectLocation);
/* Apply fix for the cookie */
FixMisplacedCookie(cookieContainer);
/* do the final request using the correct cookies. */
finalGetRequest.CookieContainer = cookieContainer;
var responseText = ReadResponse(finalGetRequest);
Console.WriteLine(responseText); // Hooray!
}
private static string ReadResponse(HttpWebRequest getRequest)
{
using (var responseStream = getRequest.GetResponse().GetResponseStream())
using (var sr = new StreamReader(responseStream, Encoding.UTF8))
{
return sr.ReadToEnd();
}
}
private void FixMisplacedCookie(CookieContainer cookieContainer)
{
var misplacedCookie = cookieContainer.GetCookies(new Uri(Url))[0];
misplacedCookie.Path = "/"; // instead of "/sintegra/servlet/hwsintco"
//place the cookie in thee right place...
cookieContainer.SetCookies(
new Uri("https://www.sefaz.rr.gov.br/"),
misplacedCookie.ToString());
}
}
}
关于c# - 通过 C# 模拟请求时出现错误 Forbidden 403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14139707/
我一直收到这个“禁止您无权访问此服务器上的/。此外,在尝试使用 ErrorDocument 处理请求时遇到 403 禁止错误。”当尝试访问我的网站时,错误仍然存在,但没有安装 WordPress
我对Kibana创建的“新用户”有问题(使用用户“ flex ”)。这是我做的顺序。 我正在使用ELK for 7.5.1版本 首先,我通过添加elasticsearch.yml 来启用xpack.s
我只是在Elasticsearch 7.1.0中设置了xpack 如下在elasticsearch.yml中: xpack.security.enabled: true discovery.type:
我刚刚在新安装的 ES 堆栈上设置了身份验证。 我跟着: https://www.elastic.co/guide/en/elastic-stack-overview/current/get-star
我尝试在我的 Spring Boot 应用程序上配置 OpenFeign,我使用 pokeapi 进行测试。 我编写了这段代码: @FeignClient(value = "pokeapi", url
我正在使用strapi,我在调用api时收到错误403 Forbidden,例如http://localhost:1337/data 我已经调用了所有的 API,结果是相同的 403 错误 我也用 p
当我尝试将图片上传到“汽车”对象时,我被拒绝访问 S3。但是自从我添加了 S3 以来,assets 文件夹中的站点图像显示得很好。我得到的具体错误是这样的: 2015-02-17T14:40:48.4
当我尝试在管理员授权后添加新帖子时看到此响应。 我有基于 Spring Boot 安全性的基本授权: @Configuration @EnableWebSecurity public class Se
我有一个响应式(Reactive)(Spring WebFlux)Web 应用程序,其中很少有 protected 资源的 REST API。(Oauth2)。要手动访问它们,我需要获取具有客户端凭据
可以看到的错误是 client.GetKeyStats 函数返回的 403 Forbidden。 基于源代码无需认证。 源代码:https://github.com/timpalpant/go-iex
堆栈跟踪 Exception in thread "main" com.amazonaws.services.s3.model.AmazonS3Exception: Forbidden (Servic
几天前,当我尝试将文件推送到我的 S3Bucket 时收到此异常。更早的一切似乎都能正常工作,我确信我这边没有代码更改。 com.amazonaws.services.s3.model.AmazonS
当用户尝试访问他们无权访问的资源时,我的服务器会返回 403 禁止错误。除了 header 之外,服务器还会写入一条描述错误的小消息。 在 Firefox 中,错误消息显示得很好,用户知道发生了什么。
我支持一个 java 应用程序,它有一个搜索栏,可以匹配关键字并从缓存中获取结果。 该应用程序在 Tomcat 中运行,并且还有一个 Apache Web 服务器。 搜索 aaa' 时出现问题,特殊字
我正在将网站从一台托管服务器移动到另一台托管服务器。我已经上传了文件。我正在使用表单例份验证。基本上,我要搬到 GoDaddy。 我可以直接访问登录表单:www.mysite.com/login.as
我创建了一个 Azure KeyVault,我希望我的应用服务能够访问它。据我所知,我的 App Service 的主体应该有权访问 KeyVault,但在尝试从中检索时,我总是收到以下错误。无论我是
我尝试通过应用上的 URLRequest 将 multipart/form-data 发送到 Cloud Functions for Firebase。为了测试我的云函数和应用程序是否已连接,我创建了
这是后端 SiteController.php 访问规则。当我浏览此 url site.com/backend/web/site/login 时。它显示禁止 (#403)。 return [
使用 java 访问 Google PubSub、Dataflow 和 BigQuery 的 Spring boot 应用程序。该应用程序是使用 maven 构建的,并将 jar 文件复制到 Goog
我在 Kubernetes* 的仪表板站点上到处都是“被禁止”(见图) 重现: 通过站点创建 Google Kubernetes 集群,而不是通过 shell。 选择 Kubernetes 版本 1.
我是一名优秀的程序员,十分优秀!