mikrocontroller.net

Forum: PC-Programmierung Javascript - XMLHttpRequest tut nicht, warum?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Frank E. (Firma: Q3) (qualidat)


Bewertung
0 lesenswert
nicht lesenswert
Kann mir mal jemand bitte einen Tip geben, warum das Script nach der 
markierten Stelle einfach nix mehr tut? Die enthaltenen Zugangsdaten 
sind echt, aber kein Problem, es ist ein Testsystem. Danke für Hilfe!
<html>
<head>
    <title>SOAP JavaScript Client Test</title>
    <script type="text/javascript">

        function soapTest()
        {
            var request = new XMLHttpRequest();         
            var xmls = "";

            xmls+="<?xml version='1.0' encoding='utf-8'?>";
            xmls+="<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' ";
            xmls+="xmlns:ns='http://dpd.com/common/service/types/LoginService/2.0'>";
            xmls+="<soapenv:Body>";
            xmls+="<ns:getAuth>";
            xmls+="<delisId>sandboxdpd</delisId>";
            xmls+="<password>xMmshh1</password>";
            xmls+="<messageLanguage>de_DE</messageLanguage>";
            xmls+="</ns:getAuth>";
            xmls+="</soapenv:Body>";
            xmls+="</soapenv:Envelope>";
               
            request.open("POST", "https://public-ws.dpd.com/services/LoginService/V2_0/?wsdl", false);
            request.setRequestHeader("SOAPAction","http://dpd.com/common/service/LoginService/2.0/getAuth");
            request.setRequestHeader("Content-Type", "text/xml");
           
            alert(xmls);
            alert("es get los ...");

            request.send(xmls);    //<====== hier geht nix mehr :-(

            alert("es ist durch ...");
            alert(request.responseText);
        }
    </script>
</head>
<body> 
            <input type="button" value="Soap" onclick="soapTest();" />
</body>
</html>

Der letzte Parameter bei request.open() ist mit Absicht "false", d.h. 
das Script wartet, bis ein Ergebnis kommt (synchron), ansonsten rauscht 
es dort einfach durch (asynchron), aber Ergebnisse kommen dann auch 
keine ... nichtmal eine Fehlermeldung. Damit ist der Server ansonsten 
sehr freigiebig

: Bearbeitet durch User
von Christobal M. (c_m_1)


Bewertung
0 lesenswert
nicht lesenswert
Hast du mit wireshark nachgesehen ob der request raus geht? Eventuell 
wartet das Script nur auf einen Response/Timeout.

von 3.14 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Gibt es irgendeine Meldung in der Entwicklerkonsole?

von Frank E. (Firma: Q3) (qualidat)


Bewertung
0 lesenswert
nicht lesenswert
3.14 schrieb:
> Gibt es irgendeine Meldung in der Entwicklerkonsole?

guter Hinweis, hatte ich übersehen:

"Quellübergreifende (Cross-Origin) Anfrage blockiert: Die 
Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf 
https://public-ws.dpd.com/services/LoginService/V2_0/?wsdl. (Grund: 
CORS-Kopfzeile 'Access-Control-Allow-Origin' fehlt)."

Habe das File auf dem Desktop liegen und nicht in einem Server. Brrrr

von 3.14 (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Frank E. schrieb:
> 3.14 schrieb:
> Gibt es irgendeine Meldung in der Entwicklerkonsole?
>
> guter Hinweis, hatte ich übersehen:
>
> "Quellübergreifende (Cross-Origin) Anfrage blockiert: Die
> Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf
> https://public-ws.dpd.com/services/LoginService/V2_0/?wsdl. (Grund:
> CORS-Kopfzeile 'Access-Control-Allow-Origin' fehlt)."
>
> Habe das File auf dem Desktop liegen und nicht in einem Server. Brrrr

Setz dir ein Apache auf (Standardkonfiguration) und mach deine Projekte 
darin. Aber sei vorsichtig, dass keine Portfreigaben eingerichtet sind. 
Das Problem wird aber bleiben. Um es zu beheben, hast du die Möglichkeit
a) den Serverdienst auf den eigenen Server verfrachten (evtl. PHP oä 
installieren)
b) JSONP verwenden (ist viel einfacher, als es klingt)

von Hacker (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hmm... Magst Du Dir ein neues Passwort machen?

von Frank E. (Firma: Q3) (qualidat)


Bewertung
0 lesenswert
nicht lesenswert
So Passwort geändert ... ist aber m.E: unkritisch, weil eh nur Sandbox.

Aber: Ich habe das Script jetzt in den Apache meiner Synology versetzt, 
anstatt direkt als File zu öffen. Es "klemmt " aber immer noch an der 
gleichen Stelle.

Ursprünglich dachte ich ja an ein Rechte-Problem: Von wegen File und 
aktive Inhalte - Browser haben da sehr eigene Ansichten - ist aber 
nicht. Bis zum ersten Alert wird es ausgeführt und dann ist Ende. Auch 
kein Timeout, es sei denn, dieses ist 20min lang ... Mist.

von Frank E. (Firma: Q3) (qualidat)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe mich jetzt nochmal zum Thema CORS belesen - "tolle" Erfindung.

Das heisst am Ende, ich kann keinen XMLHttpRequest auf eine Domäne 
machen, in der nicht auch mein eigenes Script liegt. Das ist echt super 
z.B. für die Kontaktaufnahme zu einem Paketdient ...

Damit ist dieser Versuch wohl erledigt.

von Pico (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Es sei denn, der Server erlaubt es.

von Rene K. (xdraconix)


Bewertung
0 lesenswert
nicht lesenswert
Frank E. schrieb:
> Ich habe mich jetzt nochmal zum Thema CORS belesen - "tolle"
> Erfindung.
>
> Das heisst am Ende, ich kann keinen XMLHttpRequest auf eine Domäne
> machen, in der nicht auch mein eigenes Script liegt. Das ist echt super
> z.B. für die Kontaktaufnahme zu einem Paketdient ...
>
> Damit ist dieser Versuch wohl erledigt.

Das hat ja auch seinen Grund. Aus Sicherheitstechnicher Sicht wäre dies 
ein absoluter Super-Gau. Und wie bereits erwähnt kann man dies 
"freischalten" auf dem Server. Dies macht man aber auch nur für bekannte 
IPs.

Wenn der Paketdienst eine "Kontaktaufnahme" wünscht. Dann stellt er auch 
eine Möglichkeit dazu bereit (JSON, XML File, UDP Req,...).

Wie wäre es in diesem Fall, wenn du einfach mal den Paketdienst fragst 
welche Möglichkeiten er bietet die nötigen Informationen zu bekommen?


Hier eine API von DPD:

https://www.shippypro.com/dpd-API.html

Wie man sieht ist diese nicht kostenfrei, deswegen wird es auch keine 
kostenfreie Schnittstelle nach außen geben. 😉

: Bearbeitet durch User
von Frank L. (Firma: Flk Consulting UG) (flk)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Frank,
lad Dir mal SoapUI runter und trag dort Deine Daten so ein wie Du sie 
sendest, dann kannst Du relativ genau sehen was passiert.

Gruß
Frank

von Frank L. (Firma: Flk Consulting UG) (flk)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Frank,

ich habe das mal eben durchlaufen lassen. Da Deine Passwort natürlich 
geändert wurde erhalte ich keine Antwort bzw. ein "Fault occured". Der 
Service antwortet also.

Im Anhang mal das Ergebnis aus SoapUI.

Gruß
Frank

: Bearbeitet durch User
von woas i nit (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
da steht doch genau was der fehler ist:
<errorCode>LOGIN_8</errorCode>
<errorMessage>Die Kombination aus Benutzername und Passwort ist unbekannt.</errorMessage>

von CORS-Liebhaber (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Frank E. schrieb:
> Ich habe mich jetzt nochmal zum Thema CORS belesen - "tolle" Erfindung.
>
> Das heisst am Ende, ich kann keinen XMLHttpRequest auf eine Domäne
> machen, in der nicht auch mein eigenes Script liegt. Das ist echt super
> z.B. für die Kontaktaufnahme zu einem Paketdient ...
>
> Damit ist dieser Versuch wohl erledigt.

Google mal nach "CORS-Proxies". Statt per XMLHttpRequest direkt auf die 
gewünschte Resource zuzugreifen, schickt man seinen Request stattdessen 
an den CORS-Proxy, teilt ihm mit, auf welche URL man eigentlich 
zugreifen möchte, und bekommt dann vom Proxy die gewünschte Ressource 
zurückgeliefert, aber mit passendem "Access-Control-Allow-Origin 
*"-CORS-Header.

Und schwupps, schon hat man das völlig schwachsinnige Sicherheitskonzept 
hinter CORS einfach ad absurdum geführt.

von DPA (Gast)


Bewertung
0 lesenswert
nicht lesenswert
CORS-Liebhaber schrieb:
> Und schwupps, schon hat man das völlig schwachsinnige Sicherheitskonzept
> hinter CORS einfach ad absurdum geführt.

No, hat man nicht. Der sinn von cors ist es unter anderem, dass eine 
seite nicht einfach so im nahmen eines anderen anhand seiner session 
genutzt werden kann. Ein cors proxy hat einen anderen origin, und damit 
nicht die selben session cookies. Natürlich muss das mit techniken wie 
stp kombiniert werden, um effektiv zu sein. Ein anderer Aspekt ist, dass 
dank CORS webbrowser nicht als proxies misbraucht werden können.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.