Laden...

Mit HttpWebRequest den Webbrowser bei XML-Post-Request nachahmen -> 403 oder 500

Erstellt von garv3 vor 11 Jahren Letzter Beitrag vor 11 Jahren 5.424 Views
G
garv3 Themenstarter:in
70 Beiträge seit 2009
vor 11 Jahren
Mit HttpWebRequest den Webbrowser bei XML-Post-Request nachahmen -> 403 oder 500

Hallo zusammen,

ich hab hier ein Javascript, das im Firefox super funktioniert. Ich habe nun versucht, dies per C# nachzuahmen. Im grunde macht das Script nichts weiter, als ein zuvor per Browser ausgelesenes Authentifizierungs-Token in ein XML-Dokument einzubauen und dieses dann per POST an eine URL zu senden. Hier mal der wichtigste Teil des JS:

        var xml = new XML(data);
        [...]
        xml.authenticationHeader.@auth_token = auth_token;

        var xhr = new XMLHttpRequest();
        xhr.withCredentials = true;
        xhr.open("POST", "http://www.xxx.com/yyy", true);

        xhr.send(xml.toXMLString().replace(re, video_id)); // fix Skip Annotations to link to new video_id

auth_token wurde wie gesagt zuvor in der selben Browsersession, in der auch das Script ausgeführt wird, ausgelesen. Das funktioniert alles wunderbar.

Doch nun zum Problem.
Ich habe nun das Problem, dass das JS im Internetexplorer einfach nicht läuft. Abdernfalls hätte ich mir mit dem WebBrowser ja etwas zurechtbasteln können. Doch ich muss es nun anscheinend komplett nachahmen. Aber es scheint so, als würde das auth_token nur für eine ganz bestimmte Browsersession bereitgestellt. Bisher habe ich es nämlich so probiert:
Mit dem WebBrowser-Control hab ich mir sowohl XML als auch das Authentifizierungtoken geholt. Das funktioniert auch einwandfrei. Nun füge ich das auth_token entsprechend in den authenticationheader des XML-Dokuments ein und muss es also nur noch zum Server schicken. Das versuche ich natürlich per HttpWebRequest bzw. WebRequest. Hier mal ein ausführlich kommentierter Auszug:

                
                // Request erstellen und URL setzen
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.xxx.com/yyy");
                // Cookies des WebBrowsers laden
                request.CookieContainer = GetCookieContainer();
                request.Method = WebRequestMethods.Http.Post;
                // Credentials übergeben - Macht das überhaupt Sinn?
                request.UseDefaultCredentials = true;
                // Accept == Accept-Charset?
                request.Accept = "application/xml";
                request.ContentType = "application/xml";
                // User-Agent des WebBrowsers nachahmen
                request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Zune 4.7)";
                request.AllowAutoRedirect = true;
                request.KeepAlive = true;
                // XML einlesen
                byte[] bytes = System.Text.Encoding.ASCII.GetBytes(xdoc.InnerXml);
                request.ContentLength = bytes.Length;
                Stream stream = request.GetRequestStream();
                stream.Write(bytes, 0, bytes.Length);
                stream.Flush();
                stream.Close();
                // XML zur Kontrolle ausgeben
                textBox2.Text = System.Text.Encoding.ASCII.GetString(bytes.ToArray());
                try
                {
                    // Request absetzen - Hier wird der 403 "Forbidden" geschmissen
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    Stream responseStream = response.GetResponseStream();
                    StreamReader reader = new StreamReader(responseStream);
                    string responseString = reader.ReadToEnd();
                    reader.Close();
                    // Hier wird der 500 "Unknown Error" geschmissen
                    MessageBox.Show(responseString);
                    response.Close();
                }
                catch (HttpException ex)
                {
                    MessageBox.Show(ex.ToString());
                }

Hierbei gibt es folgende mögliche Resultate:

  1. So wie jetzt hier konfiguriert, springt der Code in den catch-Block und gibt mir nen 500er Fehler "Unknown Error" -> Die unnützeste Fehlermeldung überhaupt 😉
  2. Wenn ich am HttpWebRequest testweise ein paar Konfigurationen verändere, bekomme ich ab und an auch einen 403 "Forbidden".

Ich vermute, dass der Server irgendwie erkennt, dass das HttpWebRequest nicht der WebBrowser ist und dass daher das Authentifizierungtoken nicht passt. Das ist aber auch nur eine Vermutung!

Hat sonst vielleicht jemand eine Ahnung?
Ich steh total auf dem Schlauch! Vielleicht mach ich auch nur irgendwas falsch!?

Tausend Dank schonmal im Voraus!

Grüße aus Kölle
derGarv

Edith sagt: Der 500er Fehler wird doch nicht im Catch geschmissen, sondern bereits im try-Block in der MessageBox ausgegeben. Hab die Stelle im Code entsprechend markiert!

M
29 Beiträge seit 2010
vor 11 Jahren

Unterstützt der HttpWebRequest überhaupt JavaScript? Ich glaube es nämlich nicht.

3.170 Beiträge seit 2006
vor 11 Jahren

Hallo,

HTTP 500 ist normalerweise "Internal Server Error", und das lässt darauf schließen, dass Dein Request nicht richtig verarbeitet werden kann.Da wir nicht sehen können, wie Du Deine Daten zusammenstellst, die Du letztlich abschickst, und wie die Auth-Daten aussehen, kann man hier eher nur mutmaßen.

Empfehlung 1: guck doch mal mit Wireshark, ob Dein Request wirklich genauso )bis auf den User-Agent) aussieht, wie der, den das Firefox-Script absetzt. Dann müsstest Du sehen was falsch läuft.

Ich würde aber eigentlich ganz woanders ansetzen:

Ich habe nun das Problem, dass das JS im Internetexplorer einfach nicht läuft.

Versuch doch das Script so zu schreiben, dass es im IE funktioniert. So kompliziert wird das wahrscheinlich nicht sein.

@mep: garv3 versucht ja - wenn ich es richtig sehe - auch gar nicht, ein Javascript per WebRequest auszuführen. Er will das, was im Firefox per Javascript passiert, ohne Javascript nachstellen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

G
garv3 Themenstarter:in
70 Beiträge seit 2009
vor 11 Jahren

Unterstützt der HttpWebRequest überhaupt JavaScript? Ich glaube es nämlich nicht. Nein, eben nicht. Deshalb wollte ich die Funktionen des JS auch anders abbilden.

guck doch mal mit Wireshark Werd ich nachher auf jeden Fall mal tun!

Versuch doch das Script so zu schreiben, dass es im IE funktioniert. So kompliziert wird das wahrscheinlich nicht sein. Leider doch! Hab diese Lösung natürlich als erste probiert. Leider ohne Erfolg. Falls jemand Lust hat, sich damit mal zu beschäftigen, kann ich gern mal nen Link zu der Seite schicken, auf der es eingesetzt wird.

16.807 Beiträge seit 2008
vor 11 Jahren

Das was Du hier versuchst zu umgehen, ist ein netter Weg, um Automatismen einzuschränken.
Sag mir Doch mal bitte die Seite, dann schau ich mir mal an, ob das ein gewollter Schutz ist, den Du hier umgehen willst, oder ob das, was Du tust, legitim ist.

Dass das Script im IE nicht läuft ist aber klar, da der IE XMLHttpRequest nicht kennt. Hier heißt es ActiveXObject("Microsoft.XMLHTTP");
Man kann sich ja jQuery anschauen, wie der das macht.

500 Unknown Error wird nach Außen angezeigt.
Der Server-Betreiber wird schon wissen, was hier den Fehler ausgelöst hat - will es aber Dir offentlich nicht sagen; was eventuell seinen Grund hat.

G
garv3 Themenstarter:in
70 Beiträge seit 2009
vor 11 Jahren

Ich habe gerade mal die Daten per Wireshark ausgelesen und verglichen. Habe nun alles so angepasst, dass zumindest alles im Block "Hypertext Transfer Protocol" und "Line-based text data: text/plain" übereinstimmt. Jetzt bekomme ich den "403: Unzulässig" wieder.
Einziger Unterschied in Wireshark ist, dass im Original "2 Reassembled TCP Segments (3308 bytes): #2091(2860), #2093(448)" mit übergeben werden, welche in meinem Request nicht enthalten sind. Kann der 403 daran liegen?

16.807 Beiträge seit 2008
vor 11 Jahren

Keine Lust meine Frage zu beantworten?

G
garv3 Themenstarter:in
70 Beiträge seit 2009
vor 11 Jahren

Das Script ist zu finden auf:
http://tgn.tv/handbooks/#youtube-annotations

Es geht spziell um folgende Funktionen:
open_annotations()
update_annotations()
Wobei open_annotations kein Problem ist. Die kann ich einfach per httpwebrequest lösen. update_annotations() hingegen kann ich ja leider nicht abbilden. Hier wird der xml-request abgesetzt...

3.170 Beiträge seit 2006
vor 11 Jahren

Hallo,

Dass das Script im IE nicht läuft ist aber klar, da der IE XMLHttpRequest nicht kennt. Hier heißt es ActiveXObject("Microsoft.XMLHTTP");

Ich kenne das eigentlich auch nur über die Variante mit ActiveXObject, man fragt ob XMLHttpRequest existiert, und wenn nicht, versucht man ein solches Objekt zu erstellen.

Dennoch sollte ab IE7 der XMLHttpRequest direkt bekannt sein: XMLHttpRequest object
Ich hab's aber noch nie ohne die o.g. Abfrage ausprobiert...

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

G
garv3 Themenstarter:in
70 Beiträge seit 2009
vor 11 Jahren

Ich habe es nun per Javascript mit XMLHttpRequest / ActiveXObject("Microsoft.XMLHTTP") probiert.
Dabei tritt allerdings ein Problem auf: Dieses Request funktioniert nicht für Cross-Domain-Anfragen. Ich kann damit also kein Request an eine andere Domain schicken. Das ist in diesem Fall jedoch nötig.

XDomainRequest() unstertützt Cross-Domain. Allerdings gibt es einem nicht die Möglichkeit, die Cookies des Browsers oder Credentials in irgend einer Form zu senden. Daher schlägt die Authentifizierung fehl.

Was nun?

16.807 Beiträge seit 2008
vor 11 Jahren

Cross-Domain lässt kein sauberer Browser mehr zu. Da gibts auch kein Argument mit "das ist nötig".
Das ist einfach nur eine riesen Sicherheitslücke, falls das irgendwo aktiv sein sollte - auch wenn man das ausschalten und für positive Zwecke verwenden KANN.

Lösung: anderen Weg suchen.