PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP]Warum kann ich diese Seite nicht parsen ?



Freak1936
27.01.2012, 00:23
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?service=mail&continue=https%3A%2F%2Fmail.google.com%2Fmail%2F%3 Ftab%3Dwm&ltmpl=googlemail

Ich hab mal ein Stück aus dem Code kopiert



//(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:


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:


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.


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.


preg_match_all('#type=hidden#', $site, $secTok);
array(1) { +++91;0+++93;=> array(0) { } }Was meint ihr woran das liegt ?

sn0w
27.01.2012, 00:26
An fehlendem Wissen über Regular Expressions.
http://www.php.net/manual/de/pcre.pattern.php

Freak1936
27.01.2012, 00:30
Muss ich mich durch die komplette Manual quälen, oder kannst das noch irgendwie eingrenzen ?

inout
27.01.2012, 00:46
Das liegt wohl an den Zeilenumbrüchen. Probier es so:


preg_match('#id="secTok"\s+value=\'([^\']+)\'#i', $site, $secTok);

Freak1936
27.01.2012, 00:53
Ja wunderbar, danke inout so klappt es! :)

Muss das /s genau an der Stelle, wo der umbruch steht, sein ?

inout
27.01.2012, 01:01
\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.

d3mux
27.01.2012, 08:50
Normalerweise gilt es als Sünde, HTML mit Regular Expressions zu parsen...

inout
27.01.2012, 09:32
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/2009/11/parsing-html-the-cthulhu-way.html ;)

Freak1936
27.01.2012, 17:33
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 ...)

inout
27.01.2012, 18:11
Was gibt es denn da für alternative zum RegEx parsen [...]
Die DOM und XML Funktionen (http://www.php.net/manual/de/refs.xml.php) 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):


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)

Bonkers
27.01.2012, 20:04
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.


id="secTok" value=(.*)>

->


id="secTok"\ value=(.*)>

inout
27.01.2012, 20:24
Man muss nicht, man kann.
Folgende Zeichen muss man escapen: [\^$.|?*+(){}

Freak1936
29.01.2012, 16:15
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_FXHnzuqUVtggIwKweZllZLFjWGYjd6Ah74.js

Ich bin mir nicht sicher ob ich den JS richtig interpretiere , noch ob ich JS überhaupt richtig verstehe, aber ich versuch es mal ...



<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').appendChi ld(bgr);
});
}
};

//ist das hier der errechnete string aus 'view-source:https://www.gstatic.com/bg/8t6xRTWi_FXHnzuqUVtggIwKweZllZLFjWGYjd6Ah74.js' ?
document.bg = new botguard.bg('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 AsfQM4FFozUH9+CmNRH3ULB0kiYkwdOTAtX0RiFBV7DwJdF3Xy QlXHkFQ1y+w7OYjaaGrltwxKsZFQJPjLFHHprUdF/7AGXtuUITyN3XJy6PYlVrCsfxLlvRlB0asEAMqPICeo2Wl05rh NINPoNneBt3cS89JqfLbmfGH3/VhF0J8ODIPRdyXS4z5Iv59UEe7dBmq5j1kr3P08NrK4CCCv+RM Ei95xUsKNPyzs2wplgbZ2D833KkSzr2gF9cICCIyGNh6Rxy06t eBPbPyzAQjY4yNXraZxEPCoDFTEvhEV35o1Mr3MfGHzqVkw0PY saJuwCB7UhB4DlZ86J7L9bG7mtAYERxeMjBlkivg2CpfwahH9/3AikZsDTdzfbmLNz0oYrMA3C96qUAaXgDJi9vZkPXx+wJIgLJf VR2HyjD4/jrgIH43VBGyfv04h1+ATZ/GAJU/fnywujtx9qcaWHByO0HN6+ogwWtuLXX3goQkCoupIaMKSOCi99 0tMxJgoOq34WFbGgzE3xvwvQbSDNTK39kNQzJw5Oa6fQSjZ4FZ R1JUgM6//WlrA9iZKu4VePcSSJzCx5EVL254sKd3gMUSl80ZR0IUkKrr/TUqzhE8r1vMvK777Wl3cgDAnte82U7iaWj/e/0lOy4o/LLDgRUXS6zxFooA2MbT1QFPPnzo6oZ5DNtfgNlm8gDYxtPVAU8 +fOjqhnkM21+A/ULSDNTK39kNQzJw5OaOcQTTV4j9KrPpPWNmMLSOz9kRNso9IO8 zxNVCw5lNExZAxP6/qWF+gnVop3vk7P6rvTknIlCciqvFXTd2dPjm55VBK1oY0NKb5f A==');
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:


bgresponse=%21Awew1T-UAQA5ACMI_EbafRM78N8l9Q0QcGeG7tKjmmizVv0orTYenfw6B bdiIcm25ZsIbEdbIsvgI4mV4yvGkNJRAgAAAF4NAC5_3frBiSs HPGnL4MXFaQVEQe2DtrYadEFB7YO2thp0QUHtg7a2GnRBQfySt Xh1
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 ?

Bonkers
29.01.2012, 18:46
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 :(

Freak1936
01.02.2012, 20:31
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.