web-dev-qa-db-fra.com

Obtenir la sortie d'une autre URL et la stocker dans une variable tout en maintenant la session

Scénario:

  1. L'utilisateur poste une demande ajax sur le site Joomla (via com_ajax ).

  2. Dans la méthode appelée, je souhaite récupérer l'intégralité de la sortie html d'un sous-menu Joomla connu (disons/contact). Le sous-menu joomla est uniquement accessible à un utilisateur différent de celui actuellement connecté.

  3. La méthode renvoie ensuite le code HTML à l'utilisateur.

OK, je peux faire les n ° 1 et n ° 3, pas de problème. Comment puis-je faire # 2?

Choses que j'ai explorées:

  • Publication via cURL - Je ne trouvais pas le moyen de conserver les variables de session et de surpasser le mécanisme de protection CSRF de Joomla.
  • En utilisant ob_start, puis en utilisant la méthode redirect de JApplication. Cela envoie uniquement les en-têtes de redirection.
  • Utiliser JApplication-> login pour emprunter l'identité d'un utilisateur. Cela résout juste une partie du problème. Je ne fais que le mentionner car si quelqu'un publie une réponse via cURL, il devra également s'attaquer au problème de l'authentification.

Des "solutions" qui ne fonctionneront pas (pour vous faire gagner du temps):

  • require/include fichier X: non, car je veux une URL complète (pouvant contenir plusieurs composants/modules)
  • Demandez à l'utilisateur d'appeler directement l'URL (dans ce cas/contact): Non, pour diverses règles de logique métier. Disons, pour simplifier, que la sortie HTML renvoyée est "enrichie" avant d’être renvoyée.
3
pkExec

J'ai eu un succès partiel avec ce qui suit, grâce à this répondre principalement:

<?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
}
?>

Cela récupère le code HTML de la page de sortie avec les informations d'identification de l'utilisateur privilégié. Maintenant, si je pouvais conserver les variables de session de l'utilisateur précédent ou les injecter dans la nouvelle session, tout serait parfait. D'après ce que j'ai compris, ce que j'essaie de faire peut s'appeler "Session empoisonnée" :)

1
pkExec