it-swarm.com.de

Rufen Sie die Ausgabe einer anderen URL ab und speichern Sie sie in einer Variablen, während Sie die Sitzung beibehalten

Szenario:

  1. Der Benutzer sendet eine Ajax-Anfrage an die Joomla-Site (über com_ajax ).

  2. Innerhalb der aufgerufenen Methode möchte ich die gesamte HTML-Ausgabe eines bekannten Joomla-Untermenüs abrufen (sagen wir/contact). Das Untermenü von joomla ist nur für einen anderen als den aktuell angemeldeten Benutzer zugänglich.

  3. Die Methode gibt dann den HTML-Code an den Benutzer zurück.

OK, ich kann Nr. 1 und Nr. 3 machen, kein Problem. Wie kann ich # 2 machen?

Dinge, die ich erkundet habe:

  • Posten über cURL - Ich konnte keine Möglichkeit finden, Sitzungsvariablen zu verwalten und den CSRF-Schutzmechanismus von Joomla zu übertreffen.
  • Mit ob_start, dann mit der redirect Methode von JApplication. Dadurch werden nur die Umleitungsheader gesendet.
  • Verwenden Sie JApplication-> login, um sich als Benutzer auszugeben. Dies löst nur einen Teil des Problems. Ich erwähne es nur, weil jemand, der eine Antwort über cURL sendet, auch das Authentifizierungsproblem lösen müsste.

"Lösungen", die nicht funktionieren (um Zeit zu sparen):

  • require/include X-Datei: Nein, da ich eine vollständige URL möchte (die mehrere Komponenten/Module enthalten kann)
  • Lassen Sie den Benutzer die URL direkt aufrufen (in diesem Fall/Kontakt): Nein, für verschiedene Geschäftslogikregeln. Nehmen wir der Einfachheit halber an, dass die zurückgegebene HTML-Ausgabe vor dem Zurücksenden "angereichert" wird.
3
pkExec

Ich hatte teilweise Erfolg mit den folgenden, dank diese Antwort hauptsächlich:

<?php
function retrieveURL($relativeURL){
    $uname = "user";    //this is the privileged user to the relative url we want
    $upswd = "pass";
    $domain = $_SERVER['HTTP_Host'];
    $prefix = $_SERVER['HTTPS'] ? 'https://' : 'http://';

    $url_get_key = $prefix.$domain."index.php?option=com_users"; 

    //GET return & key
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url_get_key );
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE );
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE );

    curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__).'/cookie.txt');   //as far as i understand, this stores a *new* session to a cookie file
    curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__).'/cookie.txt');
    curl_setopt($ch, CURLOPT_HEADER, 0 );

    $results = curl_exec($ch);

    preg_match_all("(<input type=\"hidden\" name=\"return\" value=\"(.*)\" />)siU", $results, $matches1);   //Should not be needed if username and password are correct
    preg_match_all("(<input type=\"hidden\" name=\"(.*)\" value=\"1\" />(.*)</fieldset>)iU", $results, $matches2); //Same as above

    // POST
    $url_post = $prefix.$domain."index.php?option=com_users&task=user.login";
    $postdata = "username=".urlencode($uname)."&password=".urlencode($upswd)."&return=".urlencode($matches1[1][0])."&".urlencode($matches2[1][0])."=1";
    curl_setopt($ch, CURLOPT_URL, $url_post);
    curl_setopt($ch, CURLOPT_POST, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
    $results1 = curl_exec($ch);

    $url_data = $prefix.$domain.$relativeURL;   
    curl_setopt($ch, CURLOPT_URL, $url_data);   //Now we can retrieve the proper url

    $results2 = curl_exec($ch);
    $error = curl_error($ch);
    $errno = curl_errno($ch);

    curl_close($ch);
    return $results2;   //could probably use a bit more error checking
}
?>

Dadurch wird der HTML-Code der Ausgabeseite mit den Anmeldeinformationen des privilegierten Benutzers abgerufen. Wenn ich die Sitzungsvariablen des vorherigen Benutzers behalten oder in die neue Sitzung einfügen könnte, wäre alles perfekt. Nach meinem Verständnis kann das, was ich versuche, als "Session poisoining" bezeichnet werden :)

1
pkExec