[PHP]Warum kann ich diese Seite nicht parsen ?
Hallo,
ich versuche jetzt schon eine ganze weile aus einer Seite die Werte einiger ' type="hidden" ' felder zu parsen aber aus irgendeinem Grund finden preg_match und preg_match_all nur viel zu wenige davon.
Seite: https://accounts.google.com/SignUp?s...mpl=googlemail
Ich hab mal ein Stück aus dem Code kopiert
PHP-Code:
//(code eingerückt)
<input type="hidden" name="service" id="service" value="mail">
<input type="hidden" name="continue" id="continue" value="https://mail.google.com/mail/?tab=wm">
<input type="hidden" name="ltmpl" id="ltmpl" value="googlemail">
<input type="hidden" name="timeStmp" id="timeStmp" value='1327619779492'/>
<input type="hidden" name="secTok" id="secTok" value='.AG5fkS8jUtSwWdEnj9zz3-FprJMxQvLqgA=='/>
<input type="hidden" name="dsh" id="dsh" value="7956360192668651999">
<input type="hidden" name="ktl" id="ktl" value="">
<input type="hidden" name="ktf" id="ktf">
<input type="hidden" id="_utf8" name="_utf8" value="+++9731;"/>
Wenn ich jetzt versuche z.b. secTok zu parsen finde ich nichts, hab jetzt schon ein paar Variationen durch probiert, aber ich komme nicht an die value´s hier mal ein Beispiel:
PHP-Code:
preg_match_all('#id="secTok" value=(.*)>#', $site, $secTok);
array(1) { +++91;0+++93;=> array(0) { } }
So finde ich gar nichts, das $secTok array bleibt leer. Wenn ich jetzt so suche:
PHP-Code:
preg_match_all('#id="secTok"#', $site, $secTok);
array(1) { +++91;0+++93;=> string(11) "id="secTok"" } }
Finde ich den String 'id="secTok"', aber sobald ich 'value=' ranhängen will finde ich wieder nichts.
PHP-Code:
preg_match_all('#id="secTok" value=#', $site, $secTok);
array(1) { +++91;0+++93;=> array(0) { } }
Irgendwie hab ich den Eindruck, der Fehler liegt bei dem Leerzeichen zwischen dem 'id="secTok"' und 'value=', aber wenn ich andererseits nur nach 'type=hidden' suche finde ich auch nichts(!), obwohl davon ja auf jeden fall diverse in dem code stehen.
PHP-Code:
preg_match_all('#type=hidden#', $site, $secTok);
array(1) { +++91;0+++93;=> array(0) { } }
Was meint ihr woran das liegt ?
AW: [PHP]Warum kann ich diese Seite nicht parsen ?
An fehlendem Wissen über Regular Expressions.
http://www.php.net/manual/de/pcre.pattern.php
AW: [PHP]Warum kann ich diese Seite nicht parsen ?
Muss ich mich durch die komplette Manual quälen, oder kannst das noch irgendwie eingrenzen ?
AW: [PHP]Warum kann ich diese Seite nicht parsen ?
Das liegt wohl an den Zeilenumbrüchen. Probier es so:
Code:
preg_match('#id="secTok"\s+value=\'([^\']+)\'#i', $site, $secTok);
AW: [PHP]Warum kann ich diese Seite nicht parsen ?
Ja wunderbar, danke inout so klappt es! :)
Muss das /s genau an der Stelle, wo der umbruch steht, sein ?
AW: [PHP]Warum kann ich diese Seite nicht parsen ?
\s+ steht in dem Fall für mindestens ein whitespace-Zeichen, also auch wenn dort kein Zeilenumbruch, sondern nur ein oder mehrere Leerzeichen stehen, so sollte es immer funktionieren.
Am besten im Pattern immer alle Leerzeichen durch \s+ oder \s* ersetzen, dann gibt es keine Probleme.
AW: [PHP]Warum kann ich diese Seite nicht parsen ?
Normalerweise gilt es als Sünde, HTML mit Regular Expressions zu parsen...
AW: [PHP]Warum kann ich diese Seite nicht parsen ?
Zitat:
Zitat von
d3mux
Normalerweise gilt es als Sünde, HTML mit Regular Expressions zu parsen...
Recht hast Du, ich wollte den Link vorhin schon posten, habe es dann aber doch gelassen, also hier ist er:
http://www.codinghorror.com/blog/200...hulhu-way.html ;)
AW: [PHP]Warum kann ich diese Seite nicht parsen ?
Hmmmm, mir wurde zwar dazu geraten wann immer möglich RegEx zu nutzen, aber ich lass mich na klar auch eines besseren belehren. Wird Cthulhu mich jetzt erwischen, oder hab ich noch eine Chance der ewigen Verdammnis zu entkommen :)
Was gibt es denn da für alternative zum RegEx parsen, sollte ich das lieber nur mit PHP Bordmitteln machen, oder lieber die DOM´s mit z.b. JQuery parsen statt mit RegEx zu arbeiten ?
Ich hab noch eine Frage, auf meiner Zielseite ist noch ein dubioser Wert der beim Registrieren übertragen wird, dieser wert heißt: "bgresponse=".
Leider ist dieser wert aber keine übergabe eines "hidden" field, sondern wird aus einem Stück Javascript errechnet.
http://nopaste.info/1572a72c7e.html
Hmm gaia_botguard klingt nicht gut! Wie könnte ich diesen wert denn jetzt "simulieren", einfach den JS Code so parsen wie die "hidden" Felder und einfach in das Script schreiben, oder wie würdet ihr das machen ?
(Ich bin nicht wirklich Fit in JS, deshalb frage ich mich wie man diese Protektion am besten umgehen könnte. Ich möchte hier auch nicht nach einem SRC betteln, es geht mir eher darum zu verstehen, wie ein Ansatz aussehen sollte ...)
AW: [PHP]Warum kann ich diese Seite nicht parsen ?
Zitat:
Zitat von
Freak1936
Was gibt es denn da für alternative zum RegEx parsen [...]
Die DOM und XML Funktionen z.B.
Für ein solches kleines Script würde ich aber auch RegEx benutzen...
Zum anderen Problem:
Man könnte jetzt natürlich den gesamten Algorithmus von JS nach PHP übersetzen, allerdings scheint das doch recht viel Arbeit zu sein.
Ansonsten könnte man es mit einem PHP JS Interpreter wie z.B. J4P5 probieren, allerdings habe ich da so meine Zweifel ob das funktioniert.
Ich würde dafür einfach die MSHTML Interfaces des IE missbrauchen.
Ob und wie das in PHP geht, kann ich Dir aber nicht sagen.
Ein kleines Beispiel in Delphi (aus einem alten Projekt von mir):
Code:
uses
MSHTML;
function CreateDocument(const markup: string): IHTMLDocument2;
var
doc: OleVariant;
begin
Result := CoHTMLDocument.Create as IHTMLDocument2;
doc := Result;
doc.Open;
doc.Write(markup);
doc.Close;
end;
WriteLn(CreateDocument('<script>document.write(668.5*2);</script>').body.innerHTML);
(Ausgabe: 1337)
AW: [PHP]Warum kann ich diese Seite nicht parsen ?
Zitat:
Finde ich den String 'id="secTok"', aber sobald ich 'value=' ranhängen will finde ich wieder nichts.
Auch wenn du schon eine andere Lösung gefunden hast:
Das Problem ist einfach dass man Leerzeichen escapen muss.
Code:
id="secTok" value=(.*)>
->
Code:
id="secTok"\ value=(.*)>
AW: [PHP]Warum kann ich diese Seite nicht parsen ?
Man muss nicht, man kann.
Folgende Zeichen muss man escapen: [\^$.|?*+(){}
AW: [PHP]Warum kann ich diese Seite nicht parsen ?
Also um nochmal zu meinem anderem Problem zu kommen, ich hab mich mal ein wenig über JS schlau gemacht. Also dieser wert "bgresponse" (botguard_response (?!)), scheint in einem ausgelagertem JS errechnet zu werden und zwar hier:
view-source:https://www.gstatic.com/bg/8t6xRTWi_...jWGYjd6Ah74.js
Ich bin mir nicht sicher ob ich den JS richtig interpretiere , noch ob ich JS überhaupt richtig verstehe, aber ich versuch es mal ...
Code:
<script src="https://www.gstatic.com/bg/8t6xRTWi_FXHnzuqUVtggIwKweZllZLFjWGYjd6Ah74.js"></script>
<script type="text/javascript">
function gaia_attachEvent(element, event, callback) {
if (element.addEventListener) {
element.addEventListener(event, callback, false);
} else if (element.attachEvent) {
element.attachEvent('on' + event, callback);
}
}
function gaia_getElementsByClass(className) {
if (document.getElementsByClassName) {
return document.getElementsByClassName(className);
} else if (document.querySelectorAll && document.querySelectorAll('.' + className)) {
return document.querySelectorAll('.' + className);
}
return [];
};
//Hier wird 'bgr' erstellt und an den Submit Button 'createaccount'
//rangehängt, dessen wert ' bgr.value =response;' wird in
//https://www.gstatic.com/bg/8t6xRTWi_FXHnzuqUVtggIwKweZllZLFjWGYjd6Ah74.js errechnet (?)
var gaia_botguardSubmit = function() {
if (document.bg) {
document.bg.invoke(function(response) {
//Ist dieses 'input' eine übergabe an https://www.gstatic.com/bg/* ?
var bgr = document.createElement('input');
bgr.type = 'hidden';
bgr.name = 'bgresponse';
bgr.value = response;
document.getElementById('createaccount').appendChild(bgr);
});
}
};
//ist das hier der errechnete string aus 'view-source:https://www.gstatic.com/bg/8t6xRTWi_...jWGYjd6Ah74.js' ?
document.bg = new botguard.bg('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');
var safeKtInit = function() {
try {
return doKtInit();
} catch (e) {}
};
safeKtInit();
document.getElementById('createaccount').onsubmit = function() {
if (!gaia_termsOfServiceOnSubmit()) {
return false;
}
document.getElementById('submitbutton').disabled = true;
try {
doKtSubmit();
} catch (err) {}
try {
gaia_phoneNumberOnSubmit();
} catch (err) {}
try {
gaia_botguardSubmit();
} catch (err) {}
return true;
};
Aus dem ewig langem string hinter 'document.bg = new botguard.bg' wird durch encryption oder einem anderem Algo ein viel kürzerer string der so aussieht:
Code:
bgresponse=%21Awew1T-UAQA5ACMI_EbafRM78N8l9Q0QcGeG7tKjmmizVv0orTYenfw6BbdiIcm25ZsIbEdbIsvgI4mV4yvGkNJRAgAAAF4NAC5_3frBiSsHPGnL4MXFaQVEQe2DtrYadEFB7YO2thp0QUHtg7a2GnRBQfyStXh1
Jedenfalls denke ich mir das so, kp ob das nur eine Annahme ist.
Evtl errechnet 'document.bg = new botguard.bg' ja eine checksumme aus dem gesendetem HTTP request, oder aus irgendwelchen Pixeln die geklickt werden ?
Wie arbeitet JS überhaupt, könnte ich mit z.b. cURL auf das bg.js (botguard) auch einige werte schicken und mir so einen string 'bgresponse' errechnen lassen ?
AW: [PHP]Warum kann ich diese Seite nicht parsen ?
Zitat:
Zitat von
inout
Man muss nicht, man kann.
Du hast Recht. Ich hab das gerade in Ruby und C# nachvollzogen (Was anderes hab ich hier auf dem Rechner nicht zur Hand).
Ich escape das seit Jahren also ohne Effekt. Das macht mindestens 1-2 Minuten die ich mir an Tipparbeit erspart hätte, hätte ich das früher bemerkt :(
AW: [PHP]Warum kann ich diese Seite nicht parsen ?
Also nach eingehender Recherche bin ich jetzt doch zu dem Ergebnis gekommen, das es mit PHP NICHT (ohne weiteres) möglich ist JS auszuführen noch zu parsen (hat inout ja auch schon auf der ersten Seite angesprochen, aber ich hab es nicht so mit Delphi ;)).
Ich hatte noch den Ansatz den Submit Button von Hand zu klicken, um dem JS zu zeigen das ein Mensch den Button klickt (sollte eh nur ein Mailgen für googlemail werden und die reCaptchas hätte man auch noch von Hand machen müssen, also wäre der eine klick nicht weiter wild) und das die regi nicht von einem Script ausgefüllt wird, sondern wirklich von nem Browser geladen wird.
Aber das geht auch nicht, mit php/curl kann man sich zwar den Button holen, aber da ist es genau das gleiche Problem wie vorher: Das JS erkennt das der Button nicht wirklich im Browser geklickt wurde, sondern nur Parameter übergeben werden ... bzw. das curl den SRC zwar ließt und auch holt, aber ihn eben nicht ausführen kann.