Erreur 403 Interdit la simulation de demande via C#
Portée:
Je suis en train d'élaborer un C# aplication pour simuler des requêtes en ce site. Je suis tout à fait familier avec la simulation de requêtes web pour atteindre le même homme, mais à l'aide de code à la place.
Si vous voulez essayer vous-même, il suffit de taper le numéro dans la boîte de CNPJ:
08775724000119
et écrire le captcha et cliquez sur Confirmar
J'ai thématiques avec le captcha déjà, donc ce n'est pas plus un problème.
Problème:
Dès que j'exécute la requête POST pour un "CNPJ", une exception est levée:
Le serveur distant a retourné une erreur: (403) Interdit.
Fiddler Sortie Du Débogueur:
C'est la demande générée par mon navigateur, pas par mon code
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
Des exemples de Code et des Références utilisées:
Je suis à l'aide d'un auto-développé de la bibliothèque de la poignée/envelopper le Post et les requêtes Get.
L'objet de la requête a les mêmes paramètres (Accueil,l'Origine, le Referer, Cookies..) que celui émis par le navigateur (connecté mon fiddler jusqu'ici).
J'ai aussi réussi à mettre la ServicePointValidator
de certificats à l'aide de:
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback (delegate { return true; });
Après tout que la configuration, j'ai stil se l'interdit exception.
Voici comment je simule la demande et l'exception est levée
try
{
this.Referer = Consts.REFERER;
//PARAMETERS: URL, POST DATA, ThrownException (bool)
response = Post (Consts.QUERYURL, postData, true);
}
catch (Exception ex)
{
string s = ex.Message;
}
Merci d'avance pour toute aide /solution à mon problème
Mise à jour 1:
J'ai été absent de la demande pour la page d'accueil, ce qui génère des cookies (Merci @W0lf pour m'indiquer que)
Maintenant il y a une autre chose étrange. Fiddler est de ne pas montrer mes Cookies à la demande, mais ici, ils sont :
- ce déplorable système de CAPTCHA!
- En effet, très bête.
- Vous pouvez poster tout le code que vous utilisez pour construire la demande? le Fiddler ci-dessus est pour une demande générée par votre programme, ou à partir du navigateur?
- La demande émise par le navigateur. Je pense qu'il y a un cookie manque, mais je ne suis pas sûr de l'endroit où il a été généré. En plus de vérifier maintenant, si cela n'aide pas, je vais poster le code
- Captcha validation se fait via Javascript, Pff. Même si c'est côté client, chaque captcha est généré par un indice de 1 à 191, qui est aussi moche. Ce n'est pas un dinamically généré captcha. sefaz.rr.gov.br/sintegra/images/images/60.jpg c'est TOUJOURS "la dette" la parole.
- La partie n'étant pas dynamique est étonnamment pas la chose la plus stupide à ce sujet. Le pire, c'est que la validation se fait en JS. Si vous parvenez à passer
cfield=much&_VALIDATIONRESULT=1
à chaque demande, vous devriez être bien.
Vous devez vous connecter pour publier un commentaire.
J'ai fait un succès de la demande à l'aide du navigateur et à l'enregistrer dans un violon.
Les seules choses qui diffèrent de votre demande:
sCallerURL
paramètre (j'aisCallerURL=
au lieu desCallerURL=http%3A%2F%2Fwww....
)Accept-Language:
valeurs (je suis sûr que ce n'est pas important)Content-Length
est différente (bien évidemment)Mise à jour
OK, je pensais que le Violoneux trace a partir de votre application. Dans le cas où vous n'êtes pas fixer des cookies sur votre demande, faites ceci:
https://www.sefaz.rr.gov.br/sintegra/servlet/hwsintco
. Si vous examinez la réponse, vous remarquerez que le site envoie deux cookies de session.Si vous ne savez pas comment stocker les cookies et de les utiliser dans la demande autre, prendre un coup d'oeil ici.
Mise à jour 2
Les problèmes
OK, j'ai réussi à reproduire le 403, compris ce qu'il fait, et a trouvé une solution.
Ce qui se passe dans la requête POST, c'est que:
.NET HttpWebRequest tente de faire cette redirection transparente, mais dans ce cas il y a deux questions (que je considère bugs dans le .NET mise en œuvre):
la requête GET après le POST(redirection) a le même type de contenu que la requête POST (
application/x-www-form-urlencoded
). Pour les requêtes GET, cela ne devrait pas être spécifiéla gestion des cookies problème (le problème le plus important) - Le site web envoie deux témoins:
GX_SESSION_ID
etJSESSIONID
. Le second a un chemin d'accès spécifié (/sintegra
), tandis que la première ne l'est pas.Voici la différence: le navigateur assigne par défaut d'un chemin de
/
(root) pour le premier cookie, alors .NET affecte l'url de la requête chemin (/sintegra/servlet/hwsintco
).Pour cette raison, la dernière requête GET (après redirection) à
/sintegra/servlet/hwsintpe...
n'est pas la première cookie passé, que son chemin ne correspond pas.Les correctifs
Pour ce faire, de lui dire de ne pas suivre les redirections:
et de lire ensuite les rediriger l'emplacement de la réponse POST et de faire manuellement une requête GET sur elle.
Pour cela, la solution que j'ai trouvé était de prendre le égaré cookie de la CookieContainer, set path correctement et l'ajouter au conteneur dans l'emplacement correct.
C'est le code pour le faire:
Voici tout le code pour le faire fonctionner:
Parfois HttpWebRequest besoins de l'initialisation du proxy:
demande.Proxy = new WebProxy();//dans mon cas, il n'a pas besoin de paramètres, mais vous pouvez le configurer à votre adresse proxy