login ins ngb mit cURL

Tone

beobachtet
Registriert
20 Juli 2013
Beiträge
300
So, damits nicht langweilig wird auch nochmal eine cURL Frage von mir:

Ausgangssituation:
Ich habe eine interne Webseite auf die ich mich gerne mittels cURL anmelden und dann auslesen würde. Allerdings hatte das, als ich es versucht hatte, nicht geklappt und jetzt ist mein Standort 'extern', heißt ich komme nicht mehr auf die interne Seite (rumgeeier mit VPN usw. ist mir jetzt zu doof), also ist das ngb jetzt meine Testwebsite dafür.
Anpassen für die eigentliche Website sollte ja dann auch machbar sein.

Google habe ich natürlich schon gefragt, Testscripts und alles waren auch dabei, aber ich konnte da keinen nennenswerten Unterschied zu meinen ausmachen.

[src=php]
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://ngb.to/login.php');

curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_BINARYTRANSFER, true);

curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookie.txt');

curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, "do=login&vb_login_username=Tone&vb_login_password_hint=zensiert :p");
curl_exec($curl);

curl_setopt($curl, CURLOPT_URL, 'https://ngb.to');
$gran = curl_exec($curl);

curl_close($curl);
[/src]

Dann frage ich immer auf diesen Willkommenstext im ngb ab, der ja nur angezeigt wird wenn man nicht angemeldet ist.
Und da er mir immer angezeigt wird gehe ich davon aus, dass ich nicht angemeldet bin.

Könnt ihr mir ein bisschen auf die Sprünge helfen? :unknown:
 
Könnte an einer DDoS Protection liegen, die dürfte dann unter anderem noch den User-Agent prüfen.

Da gibts vieles was dazwischen funken könnte, hast du das Request mal lokal geprüft?
 
  • Thread Starter Thread Starter
  • #3
Lokal hab ich es schon mit einer simplen Testwebsite probiert, da funktioniert auch alles wie es soll.

Habe jetzt mal die Zeile ergänzt:
[src=php]curl_setopt($curl,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko');[/src]
Damit sollte der Useragent nun vorgeben der IE11 auf Win 8.1 zu sein.
Geht aber leider immer noch nicht :(
 
Die nächste Idee wäre das ngb für den Login vielleicht SSL erzwingt, aber so kann ich nur ins Blaue schießen...

Was heißt "simple" Testwebseite?

Als vollen Test würde ich empfehlen mal eine Testdatei zu erstellen die alle vermeintlich gesendeten Daten nochmal ausgibt um sicher zu stellen das auch alles ankommt wie es soll. Und das ganze zur Sicherheit mal auf eigenen Space durchs Web schicken um mit dem Test möglichst nah an die Praxis zu kommen.

Also auch die Prüfung des Cookies nicht vergessen.
 
Also auch die Prüfung des Cookies nicht vergessen.
Schätze, es gibt da nicht soviel zu prüfen, wenn der Login fehlschlägt.


Beim Beispielskript fällt mir jetzt als erstes auf, dass er zu keinem Zeitpunkt ein Kennwort an das Board überträgt bzw. zumindest nicht richtig. Imho am richtigsten wäre es, zuerst einen md5-Hash seines Kennworts zu erstellen. Das tut die Boardsoftware i. d. R. auch beim Login (per Javascript). Diesen md5-Hash übergibt man dem Board dann über [kw]vb_login_md5password[/kw] und auch [kw]vb_login_md5password_utf[/kw]. [kw]vbulletin_login_password[/kw] bleibt leer.

Ziemlich komplett aufgeschlüsselt steht das btw. , welche Parameter man dem Board mitgeben sollte und wie man das elegant mit md5 löst.
 
Läuft das Script lokal oder auf einem Server? Falls letzteres der Fall ist könnte die DDoS Protection ebenfalls dazwischen schießen, wenn du aus einem potentiell bösartigen Netz kommst.
 
  • Thread Starter Thread Starter
  • #7
Habe jetzt alles mögliche probiert um mich auf die Seite (die richtige, nicht das ngb) einzuloggen, aber alles schlug fehl.

Ich denke ich geb es auf, mit meinen momentanen Wissenstand ist das wohl noch nicht machbar.
 
Das Skript hier funktioniert:


[src=php]function vBulletinLogin($username,$password,$url,$posturl){
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER,false);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'veri.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'veri.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_COOKIESESSION,true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,true);
curl_setopt($ch, CURLOPT_USERAGENT,$_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_REFERER, $url.'index.php');
curl_setopt($ch, CURLOPT_URL, $url.'login.php?do=login');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "vb_login_username=$username&vb_login_password&s=&securitytoken=guest&do=login&vb_login_md5password=".md5($password)."&vb_login_md5password_utf=".md5($password));
$exec = curl_exec($ch);

curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_REFERER, $url.'login.php?do=login');
curl_setopt($ch, CURLOPT_URL, $url.'clientscript/vbulletin_global.js?v=373');
$exec = curl_exec($ch);

curl_setopt($ch, CURLOPT_REFERER, $url.'login.php?do=login');
curl_setopt($ch, CURLOPT_URL, $url.'index.php');
$exec = curl_exec($ch);

curl_setopt($ch, CURLOPT_REFERER, $url.'index.php');
curl_setopt($ch, CURLOPT_URL, $posturl);

$exec = curl_exec($ch);
return $exec;

}
[/src]

POSTURL ist die Url, die du am Ende haben willst.
Aufruf also:

vBulletinLogin('benutzername','passwort','https://ngb.to/','https://ngb.to/')

Darauf einen "var_dump" o.ä bekommst du die Startseite zurück.
 
  • Thread Starter Thread Starter
  • #9
Danke!
Habe es jetzt erstmal stumpf ausprobiert und es geht sowohl im ngb als auch auf meiner Seite (zwar leicht abgewandelt, aber das ist ja nicht schlimm).

Werde das jetzt mit meinen Zeilen vergleichen, wo da der entscheidende Unterschied ist.
Wenn ich es nicht vergesse teile ich es euch dann auch mit :)
 
  • Thread Starter Thread Starter
  • #10
Ok, ich hatte 3 Fehler:

1. Fehler - hab ich vergessen
2. Fehler - Schusselfehler
3. Fehler - POST anstatt GET verwendet.

Zum 3. Fehler aber noch eine Frage, der Original Code lautet:
[src=html5]
<form id="login" method="post" action="?action=login_process">
[/src]

Da hier als Methode POST angegeben wird, bin ich davon ausgegangen das ich das auch verwenden muss, dass war aber nicht der Fall, erst nachdem ich "?action=login_process" per GET versendet habe, hat es funktioniert.

Kann mir jemand erklären warum?

Wird form immer per GET versendet und bezieht sich das POST nur auf den Inhalt der form?
 
POST und GET können gemixt werden. In deinem Codeausschnitt heißt das, die Formularfelder werden per POST an das aktuelle Script gesendet mit dem GET-Parameter action=login_process. Heißt das Script hat in $_GET['action'] nachher den Wert 'login_process' und in $_POST befindet sich ein assoziatives Array mit den Feldnamen als Schlüsseln.

Ohne den GET-Parameter wird das ganze nicht funktionieren weil im Loginscript etwas ähnliches wie das hier stehen wird:

PHP:
Expand Collapse Copy
if($_GET['action']) == 'login_process') {
    // Nutzer einloggen
}

Lässt du den Parameter weg, wird er nicht in den Abfragenblock springen und somit auch keinen Login durchführen.
 
Zurück
Oben