ajax: externe Seite mit http-request aufrufen
steckl
- javascript
0 Siechfred0 steckl
Hallo,
ich habe mal angefangen mich etwas mit ajax zu beschaeftigen und wollte dabei den Inhalt einer Seite, die nicht auf meinem Server liegt in eine Variable schreiben.
Wenn die Seite auf meinem Server liegt klappt alles wunderbar. Auch wenn ich den Pfad mit "http://MEIN_SERVER/meineSeite.html" angebe.
Wenn ich aber jetzt eine externe Seite (z.B. http://www.google.de") angebe kommt im FF 1.5 eine Fehlermeldung in der Javascript-Console:
uncaught exception: Permission denied to call method XMLHttpRequest.open
im IE 6 funktioniert das Script fehlerfrei.
Dies liegt wohl an den unterschiedlichen Sicherheitseinstellungen?
Jetzt wuede mich interessieren, ob es irgendwie moeglich ist, eine externe Seite mit Javascript/Ajax auszulesen, ohne von den Sicherheitseinstellungen des Browsers abhaengig zu sein.
Oder brauche ich dazu eine serverseitige Technik wie CGI/Perl, um an die Daten zu gelangen?
Ein Workaround waere vielleicht, mit ajax ein Perlscript aufzurufen, das eine lokale Kopie der externen Seite erstellt und diese danach einliest. Aber das waere wohl fuer den Anwender genau so (un)sicher, wie wenn die Seite gleich von ihrem aktuellem Standort aus geoeffnet wuerde oder?
Mein Code sieht momentan so aus:
function getFileContent(file)
{
// creates a new XMLHTTP request
http_request = new createXMLHttpRequest();
document.getElementById("contentDiv").innerHTML = "laden ...";
// executes the XMLHTTP request
http_request.open("GET", file, true);
http_request.onreadystatechange = alertInhalt;
http_request.send(null);
}
Das Beispiel habe ich aus einem Tutorial, wobei hier nur auf Dateien auf dem gleichen Server zugegriffen wurde. file ist die Seite die aufgerufen werden soll. Also z.B. "./test.html" (klappt) oder "http://www.google.de" (klappt nicht). http_request ist eine globale Variable.
Hoffe mir kann jemand helfen.
mfG,
steckl
Hell-O!
Wenn ich aber jetzt eine externe Seite (z.B. http://www.google.de") angebe kommt im FF 1.5 eine Fehlermeldung in der Javascript-Console:
Ja, AJAX erlaubt keinen Zugriff auf Inhalte fremder Server.
im IE 6 funktioniert das Script fehlerfrei.
Oh, der IE scheint manchmal seltsame Wege zu gehen.
Jetzt wuede mich interessieren, ob es irgendwie moeglich ist, eine externe Seite mit Javascript/Ajax auszulesen, ohne von den Sicherheitseinstellungen des Browsers abhaengig zu sein.
Du hast dir die Antwort schon gegeben:
Oder brauche ich dazu eine serverseitige Technik wie CGI/Perl, um an die Daten zu gelangen?
Siechfred
Hi,
danke fuer die schnelle Antwort.
Wenn ich aber jetzt eine externe Seite (z.B. http://www.google.de") angebe kommt im FF 1.5 eine Fehlermeldung in der Javascript-Console:
Ja, AJAX erlaubt keinen Zugriff auf Inhalte fremder Server.
Ist es sicherer fuer Besucher der Seite, wenn ich mir den Inhalt einer externen Webseite erst lokal auf meinen Server kopiere und diesen dann mit Ajax auslese?
Aus meiner Sicht macht das keinen Unterschied fuer den User, ausser dass es vielleicht etwas langsamer geht, weil die Daten erst zwischengespeichert werden muessen.
mfG,
steckl
Ist es sicherer fuer Besucher der Seite, wenn ich mir den Inhalt einer externen Webseite erst lokal auf meinen Server kopiere und diesen dann mit Ajax auslese?
Kommt drauf an, eventuell genügt ein IFrame, ganz ohne serverseitige Programmierung und AJAX. In diesem Zusammenhang würde dein Vorgehen m.E. nur dann sinnvoll sein, wenn du aus einer externen Seite Inhalte (Wetterdaten, Fußballergebnisse usw. usf.) extrahieren oder diese Inhalte anders präsentieren möchtest - natürlich nur, soweit zulässig ;)
Siechfred
Kommt drauf an, eventuell genügt ein IFrame, ganz ohne serverseitige Programmierung und AJAX. In diesem Zusammenhang würde dein Vorgehen m.E. nur dann sinnvoll sein, wenn du aus einer externen Seite Inhalte (Wetterdaten, Fußballergebnisse usw. usf.) extrahieren oder diese Inhalte anders präsentieren möchtest - natürlich nur, soweit zulässig ;)
Eigentlich hab ich momentan keinen konkreten Anwendugsfall, ich wollte nur mal ne Abwechslung zu immer "nur" Perl.
Ich hab mir gedacht, vielleicht koennte ich mit Ajax bei Klick auf einen Button den letzten Eintrag aus meinem Gaestebuch auslesen. Aber dazu werde ich jetzt wohl auch wieder auf Perl zurueckgreifen.
Aber wenigstens habe ich jetzt gelernt, wie ich ein serverseitiges Script aus einer Html-Datei heraus rufen kann und das ist ja schonmal was :-)
mfG,
steckl
Hallo,
ich habs jetzt mit einem Perlscript geloest, das ich per Ajax aufrufe.
Falls es jemanden interessiert, hier ist der code des Perlscripts:
#!/usr/local/bin/perl -w
use strict;
use LWP::Simple qw(get);
use CGI qw(header param);
use CGI::Carp qw(fatalsToBrowser);
print header();
my $urlToLoad = param('URL') || die "No Url given";
my $content = get($urlToLoad);
print $content;
Der Aufruf erfolgt wieder mit
http_request.open("GET", file, true);
nur, dass in file diesmal nicht die aufzurufende Adresse direkt steht, sondern z.B. "getExtUrl.pl?URL=http://www.google.de" (getExtUrl.pl ist der Name des Perlscripts).
mfG,
steckl
Hell-O!
ich habs jetzt mit einem Perlscript geloest, das ich per Ajax aufrufe.
In was für einem HTML-Element landen die Ausgaben des Scripts?
my $urlToLoad = param('URL') || die "No Url given";
Fatal error: $urlToLoad is tainted.
Daneben solltest du das Script nicht einfach so sterben lassen, sondern eine vernünftige Meldung zurückgeben, die den armen User, der mit AJAX putzt und Perlen verschenkt, nicht verwirrt.
my $content = get($urlToLoad);
print $content;
Du kannst das Ganze vereinfachen und solltest zudem eine Fehlerabfrage einbauen:
defined get($urlToLoad) ? getprint($urlToLoad) : print "Fehler beim Lesen von $urlToLoad.";
Aber worauf ich eigentlich hinauswollte ist, dass du in eine komplette HTML-Datei keine weitere komplette HTML-Datei einbauen solltest. Gegebenenfalls parse das Ergebnis bereits serverseitig und liefere nur den gewünschten Teil aus.
Siechfred
Hallo,
Hell-O!
In was für einem HTML-Element landen die Ausgaben des Scripts?
Momentan in einer Textarea.
my $urlToLoad = param('URL') || die "No Url given";
Fatal error: $urlToLoad is tainted.
Diese Meldung kommt bei mir nicht (auch nicht, wenn ich -T verwende), liegt vielleicht an der veralteten Perlversion (5.005).
Heisst das ich sollte einen Check auf gueltige Zeichen einbauen?
z.B. mit einem regExp?
Daneben solltest du das Script nicht einfach so sterben lassen, sondern eine vernünftige Meldung zurückgeben, die den armen User, der mit AJAX putzt und Perlen verschenkt, nicht verwirrt.
klingt vernuenftig (zumindest der erste Teil. Das mit AJAX putzen versteh ich net so ganz ;)
Hab mir jetzt folgende einfache Routine gebaut, die ich anstatt "die" aufrufe:
sub errOut($)
{
print "<span style='color:red'>$_[0]</span>";
exit;
}
Ist das jetzt gut, oder sollte man es auch nicht so machen?
my $content = get($urlToLoad);
print $content;Du kannst das Ganze vereinfachen und solltest zudem eine Fehlerabfrage einbauen:
defined get($urlToLoad) ? getprint($urlToLoad) : print "Fehler beim Lesen von $urlToLoad.";
"getprint(...)"? Meinst du vielleicht "print get(...)"
Aber hier koennte ich auch wieder die oben genannte Routine wie bei param verwenden.
Aber worauf ich eigentlich hinauswollte ist, dass du in eine komplette HTML-Datei keine weitere komplette HTML-Datei einbauen solltest. Gegebenenfalls parse das Ergebnis bereits serverseitig und liefere nur den gewünschten Teil aus.
Das sehe ich auch so, aber es ist ja nur zu Testzwecken.
mfG,
steckl
Hell-O!
my $urlToLoad = param('URL') || die "No Url given";
Fatal error: $urlToLoad is tainted.
Diese Meldung kommt bei mir nicht (auch nicht, wenn ich -T verwende), liegt vielleicht an der veralteten Perlversion (5.005).
Nene, ich wollte Cheatah-like auf einen Fehler aufmerksam machen, ist mir wohl misslungen.
Heisst das ich sollte einen Check auf gueltige Zeichen einbauen?
z.B. mit einem regExp?
Ja, irgendsowas in der Art.
Hab mir jetzt folgende einfache Routine gebaut, die ich anstatt "die" aufrufe:
[...]
Ist das jetzt gut, oder sollte man es auch nicht so machen?
Finde ich auf jeden Fall besser als die die-Variante.
defined get($urlToLoad) ? getprint($urlToLoad) : print "Fehler beim Lesen von $urlToLoad.";
"getprint(...)"? Meinst du vielleicht "print get(...)"
Ein Blick in die Doku hilft:
getprint($url)
Get and print a document identified by a URL. The document is printed to the selected default filehandle for output (normally STDOUT) as data is received from the network. If the request fails, then the status code and message are printed on STDERR. The return value is the HTTP response code.
:-)
Siechfred
Nene, ich wollte Cheatah-like auf einen Fehler aufmerksam machen, ist mir wohl misslungen.
Vielleicht bin ich auch einfach noch zu gruen hinter den Ohren fuer diese Art Humor ;-)
"getprint(...)"? Meinst du vielleicht "print get(...)"
Ein Blick in die Doku hilft.
sorry, mein Fehler:
ich hatte oben noch stehen "use LWP::Simple qw(get);", klar dass er dann keine anderen Routinen aus LWP::Simple kennt.
Der Grund war, dass sich "use LWP::Simple;" nicht mit "use CGI qw(:standard);" vertragen hat und auf der Kommandozeile folgende Warnung ausgegeben hat:
Prototype mismatch: sub main::head ($) vs none at /usr/local/lib/perl5/5.00502/CGI.pm line 198.
Ich habs jetzt so geloest, dass ich nur die Routinen aus den Modulen, die ich tatsaechlich brauche, bei "use" aufzaehle.
mfG,
steckl
Ist es sicherer fuer Besucher der Seite, wenn ich mir den Inhalt einer externen Webseite erst lokal auf meinen Server kopiere und diesen dann mit Ajax auslese?
Aus meiner Sicht macht das keinen Unterschied fuer den User, ausser dass es vielleicht etwas langsamer geht, weil die Daten erst zwischengespeichert werden muessen.
externe seiten kannst du definitiv nicht mit ajax und auch nicht mit iframe (auch nicht zusätzlich) auslesen. das ganze ist eine nicht zu unterschätzende sicherheitslücke des ie. da zwischen serverseitigem und clientseitigem aufruf ein unterschied besteht. (selbst eine unterscheidung mit und ohne www. ist schwer, aber nicht unmöglich)
du könntest beispielsweise die cookies eines users klauen.