8
votes

Comment passer des valeurs de session d'une requête à une autre de manière consécutive en utilisant cURL en PHP?

Lors d'une première demande, un identifiant de session est créé. Le même identifiant de session est appliqué à la deuxième demande.

Dans ma troisième demande, un nouvel identifiant de session est créé pour une connexion réussie, mais lorsque j'imprime l'identifiant de session pour la troisième demande, la réponse donne un identifiant de session différent . Pourquoi cela arrive-t-il? Et je veux envoyer l'identifiant de session que j'ai obtenu dans la 3ème réponse à la 4ème?

Comment y parvenir?

 entrez la description de l'image ici

Voici mon code:

<?php
$fp = fopen("cookies.txt", "w");
fclose($fp);
$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_HEADER => TRUE,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_URL => 'https://192.168.2.35/cgi-bin/common/login/webLogin',
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_COOKIESESSION => TRUE,
    CURLOPT_COOKIEFILE => "cookies.txt",
    CURLOPT_COOKIEJAR => "cookies.txt",
    CURLOPT_FOLLOWLOCATION => TRUE,
    CURLOPT_AUTOREFERER => TRUE,
));
$result = curl_exec($curl);

if (!curl_exec($curl))
{
    die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
}

echo "<h2>Response 1</h2>";
print_r($result);
$cookies = curl_getinfo($curl, CURLINFO_COOKIELIST);
print_r($cookies);

// #######################################################################################

$fields = array(
    'userName' => 'dadmin',
    'logonButton' => 'Logon',
    'actionStep' => 2,
);
$fields_string = http_build_query($fields);
curl_setopt_array($curl, array(
    CURLOPT_HEADER => TRUE,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_URL => 'https://192.168.2.35/cgi-bin/common/login/webLogin',
    CURLOPT_POST => TRUE,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_POSTFIELDS => $fields_string,
    CURLOPT_FOLLOWLOCATION => TRUE,
    CURLOPT_COOKIESESSION => TRUE,
    CURLOPT_AUTOREFERER => TRUE,
));
$resp = curl_exec($curl);

if (!curl_exec($curl))
{
    die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
}

echo "<h2>Response 2</h2>";
print_r($resp);
$cookies = curl_getinfo($curl, CURLINFO_COOKIELIST);
print_r($cookies);

// ################################################################################################

$fields = array(
    'userName' => urlencode('dadmin') ,
    'pa55word' => urlencode('dadmin01') ,
    'logonButton' => urlencode('Logon') ,
    'actionStep' => urlencode(3) ,
);
$fields_string = http_build_query($fields);
curl_setopt_array($curl, array(
    CURLOPT_HEADER => TRUE,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_URL => 'https://192.168.2.35/cgi-bin/common/login/webLogin',
    CURLOPT_POST => TRUE,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_POSTFIELDS => $fields_string,
    CURLOPT_FOLLOWLOCATION => TRUE,
    CURLOPT_COOKIESESSION => TRUE,
    CURLOPT_AUTOREFERER => TRUE,
));
$response = curl_exec($curl);

if (!curl_exec($curl))
{
    die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
}

echo "<h2>Response 3</h2>";
print_r($response);
echo "<br/>";
$cookies = curl_getinfo($curl, CURLINFO_COOKIELIST);
print_r($cookies);

// ###########Login Completed##################

curl_setopt_array($curl, array(
    CURLOPT_COOKIESESSION => TRUE,
    CURLOPT_HEADER => TRUE,
    CURLOPT_RETURNTRANSFER => TRUE,
    CURLOPT_URL => 'https://192.168.2.35/cgi-bin/msg/mango/admin/controller/SubscriberMgmt',
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_FOLLOWLOCATION => TRUE,
    CURLOPT_AUTOREFERER => TRUE,
));
$result = curl_exec($curl);

if (!curl_exec($curl))
{
    die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
}

echo "<h2>Response 4</h2>";
print_r($result);
echo "<br/>";
$cookies = curl_getinfo($curl, CURLINFO_COOKIELIST);
print_r($cookies);
exit;
?>


2 commentaires

Veuillez mettre à jour votre message avec le dernier code que vous avez utilisé.


Ici pastebin.com/YLw6eX1N @hindmost


3 Réponses :


5
votes

Vous devez spécifier le fichier cookie dans chaque requête, pas seulement dans la ou les deux premières:

$cookieFile = '/tmp/cookies.txt';
if (! is_readable($cookieFile) || ! is_writable($cookieFile)) {
    throw new \Exception(
        'Cookiefile ' . $cookieFile . ' is not writable or readable.'
    );
}

Assurez-vous également que le fichier est réellement accessible en écriture:

CURLOPT_COOKIEFILE => "/tmp/cookies.txt",
CURLOPT_COOKIEJAR => "/tmp/cookies.txt",


9 commentaires

C'est très bien. En fait, dans la 3ème requête, j'obtiens de nouvelles sessions pour une connexion réussie donc cela génère de nouvelles sessions. J'ai besoin de porter cette session pour la 4ème demande. pas d'anciennes sessions. J'explique clairement dans l'image. Vérifiez s'il vous plaît


@Siddharthaesunuri vous devez spécifier le fichier cookie dans chaque requête! Si vous souhaitez réinitialiser les cookies, vous tronquerez le fichier mais vous devez toujours indiquer à curl où stocker les cookies.


D'accord, Dan selon votre suggestion. J'ai écrit cette ligne file_put_contents ("cookies.txt", ""); avant la troisième demande. Mais quand même, j'obtiens la même chose.


Il convient de noter que les options CURLOPT_COOKIEFILE / CURLOPT_COOKIEJAR doivent être définies avec la valeur de chemin absolute . "cookie.txt" est un chemin relatif .


J'ai défini le chemin Absolute , mais la même chose ne fonctionne pas @hindmost


@Siddharthaesunuri Mettez à jour le code de votre message avec celui que vous avez essayé actuellement.


J'ai remplacé "cookies.txt" par "\ cookies.txt" partout @hindmost


@Siddharthaesunuri Voir mon commentaire sous la question. BTW "\ cookies.txt" n'est pas non plus un chemin absolu .


Si ce n'est pas correct. Alors, comment fonctionnent les sessions pour ma 2ème et 3ème demande? @le plus en arrière



1
votes
  1. tout supprimer CURLOPT_COOKIESESSION => TRUE, il n'enregistre qu'un seul cookie, pas de le réécrire
  2. $ fcookies = __DIR __. "/ cookies.txt"; nom du fichier init
  3. Ajouter toutes les demandes CURLOPT_COOKIEFILE => $ fcookies, CURLOPT_COOKIEJAR => $ fcookies,

  4. Analyse de l'étape 3

    wget --load-cookies cookie.txt --save-cookies cookie.txt -S -O step1.txt --no-check-certificate https://192.168.2.35/cgi-bin/common/login/webLogin
    cat cookie.txt
    wget --load-cookies cookie.txt --save-cookies cookie.txt -S -O step2.txt --post-data "userName=dadmin&logonButton=Logon&actionStep=2" --no-check-certificate https://192.168.2.35/cgi-bin/common/login/webLogin
    cat cookie.txt
    wget --load-cookies cookie.txt --save-cookies cookie.txt -S -O step3.txt --post-data "userName=dadmin&pa55word=dadmin01&logonButton=Logon&actionStep=3" --no-check-certificate https://192.168.2.35/cgi-bin/common/login/webLogin
    cat cookie.txt
    wget --load-cookies cookie.txt --save-cookies cookie.txt -S -O step4.txt --post-data "motdContinue=Continue&actionStep=motdContinue" --no-check-certificate https://192.168.2.35/cgi-bin/common/loginMotd/w_motd
    cat cookie.txt
    wget --load-cookies cookie.txt --save-cookies cookie.txt -S -O step5.txt --no-check-certificate https://192.168.2.35/cgi-bin/msg/mango/admin/controller/SubscriberMgmt
    cat cookie.txt
    

    Wget way

    echo "<h2>Response 3</h2>";
    print_r($response);
    
    $new_sid = explode("sessionId=",$response);
    $new_sid = explode(";",$new_sid[1]);
    $new_sid = $new_sid[0];
    
    file_put_contents($fcookies,"192.168.2.35 FALSE / TRUE 0 sessionId ".$new_sid);
    
    echo "<br/>";
    $cookies = curl_getinfo($curl, CURLINFO_COOKIELIST);
    print_r($cookies);
    
    $curl = curl_init();
    

9 commentaires

J'ai essayé ce que vous avez suggéré, mais le même résultat que j'obtiens @FAEWZX


analyse simple de $ response à l'étape 3 et relancez curl. Ajouter à la sortie de texte de publication - 3 étapes.


Je ne t'ai pas compris @FAEWZX


Selon votre suggestion, j'ai modifié le code, mais j'obtiens le même résultat. Voici mon dernier code selon votre suggestion pastebin.com/YLw6eX1N @FAEWZX


À l'étape 3, cliquez sur le bouton "Continuer", veuillez l'afficher en HTML. Quel est le même résultat?


Oui, il donne une nouvelle sessionId


continuons cette discussion dans le chat .


supprimer tout CURLOPT_COOKIESESSION => TRUE, il n'enregistre qu'un seul cookie, ne le réécrit pas - CURLOPT_COOKIESESSION ne sauvegarde rien, il supprime tous les cookies. (mais vous avez raison, il devrait se débarrasser de l'option)


il devrait en fait être $ fcookies = __DIR __. DIRECTORY_SEPARATOR. "cookies.txt"; - le code actuel n'est valide que pour les systèmes linux / bsd / macos, il n'est pas valide pour les systèmes Windows. mais avec DIRECTORY_SEPARATOR, c'est valable pour tous les systèmes



1
votes

parce que vous dites à plusieurs reprises à curl de supprimer tous les cookies de session existants, voici la documentation php sur CURLOPT_COOKIESESSION :

TRUE pour marquer cela comme une nouvelle "session" de cookie. Cela forcera libcurl à ignorer tous les cookies qu'elle est sur le point de charger qui sont des "cookies de session" de la session précédente. Par défaut, libcurl stocke et charge toujours tous les cookies, qu'ils soient des cookies de session ou non. Les cookies de session sont des cookies sans date d'expiration et ils sont censés être vivants et existants pour cette "session" uniquement.

  • chaque fois que vous définissez CURLOPT_COOKIESSION, vous dites à curl de supprimer tous les cookies de session existants , et vous définissez cela pour chaque appel. vous n'avez pas du tout besoin de le définir, à moins que vous ne souhaitiez effacer les anciens cookies pré-existants dans le pot de cookies. débarrassez-vous simplement de TOUTES les références à CURLOPT_COOKIESESSION - si vos anciens cookies ont expiré, le serveur vous donnera juste une nouvelle session dans curl_exec ().

btw vous faites cela mal:

function http_build_query(array $data):string{
    $ret='';
    foreach($data as $key=>$val){
        $ret.=urlencode($key)."=".urlencode($data)."&";
    }
    $ret=substr($ret,0,-1);
    return $ret;
}

ici le nom d'utilisateur / mot de passe / etc sera codé en double url. le code doit lire:

$fields = http_build_query(array(
    'userName' => 'dadmin',
    'pa55word' => 'dadmin01',
    'logonButton' => 'Logon',
    'actionStep' => 3,
));

parce que http_build_query DOES url-encoding, http_build_query est pratiquement implémenté comme ceci:

$fields = array(
    'userName' => urlencode('dadmin') ,
    'pa55word' => urlencode('dadmin01') ,
    'logonButton' => urlencode('Logon') ,
    'actionStep' => urlencode(3) ,
);
$fields_string = http_build_query($fields);


1 commentaires

@Siddharthaesunuri, le site Web renomme probablement le cookie pour vous. activez CURLOPT_VERBOSE et enregistrez la sortie stderr pour le découvrir.