una tiempo ruta que llamar cookie capturar array php session curl cookies file-get-contents

php - tiempo - Recuperación de la página HTML del sitio web usando cURL con la sesión actual y los datos de las cookies en la página protegida



ruta de cookies php (3)

Pregunta completamente revisada el 19 de febrero.

Lo que quiero (en definitiva):

Me gustaría obtener una página HTML usando cURL que esté protegida con un inicio de sesión de usuario (en el momento de la solicitud de cURL, el usuario ha iniciado sesión con derechos en la página ).

Más detallado:

La situación es que el usuario está en una página web como index.php?w=2344&y=lalala&x=something que está protegido (por el script de seguridad class.Firewizz.Security.php ). En esa página hay un botón "imprimir como pdf". Esto envía al usuario a la página getPDF.php Esta página ve de dónde proviene la solicitud y obtiene esa página usando cURL y esa salida se enviará al navegador como PDF imprimible.

Pero por ahora, establezco la variable de página estática en la página getPDF.php para que no verifique el referente y estoy 100% seguro de que la página que intenta obtener es correcta.

Además, la salida se repite tal como está y aún no se ha convertido a PDF solo para que no interfiera con el problema.

La salida esperada es ahora la misma que lo sería si el usuario vaya a la página. Excepto que este no es el caso, el usuario no obtiene nada.

¿Qué sabemos? Sabemos que los datos de $_SESSION NO se están enviando a la cURL, lo sé a $_SESSION porque me $_SESSION eco de los datos de $_SESSION en el archivo de salida que dice que están vacíos.

Después de muchos intentos, todavía no tenemos ninguna solución, aún no tenemos datos de ''$ _SESSION''.

No quiero comprometer el script de seguridad de ninguna manera, por lo que la solución "eliminar ini_set(''session.use_only_cookies'', 1); NO es lo que estoy buscando".

A petición (para los que están dedicados a ayudar) puedo enviar archivos de script completos, pero publicaré fragmentos relevantes a continuación.

class.Firewizz.Security.php

<?php /* * Firewizz UserLogin */ namespace Firewizz; class Security { // Start the session, with Cookie data public function Start_Secure_Session() { // Forces sessions to only use cookies. ini_set(''session.use_only_cookies'', 1); // Gets current cookies params $cookieParams = session_get_cookie_params(); // Set Cookie Params session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $this->isHTTPS, $this->deny_java_session_id); // Sets the session name session_name($this->session_name); // Start the php session session_start(); // If new session or expired, generate new id if (!isset($_SESSION[''new_session''])) { $_SESSION[''new_session''] = "true"; // regenerate the session, delete the old one. session_regenerate_id(true); } } // Check of user is logged in to current session, return true or false; public function LOGGED_IN() { return $this->_login_check(); } public function LOGOUT() { // Unset all session values $_SESSION = array(); // get session parameters $params = session_get_cookie_params(); // Delete the actual cookie. setcookie(session_name(), '''', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]); // Destroy session session_destroy(); if (!headers_sent()) { header("Location: " . $this->login_string, true); } else { echo ''<script>window.location="/"</script>''; } } // Must pass variables or send to login page! public function BORDER_PATROL($user_has_to_be_logged_in, $page_loaded_from_index) { $pass_border_partrol = true; if (!$this->LOGGED_IN() && $user_has_to_be_logged_in) { $pass_border_partrol = false; } if (filter_input(INPUT_SERVER, "PHP_SELF") != "/index.php" && $page_loaded_from_index) { $pass_border_partrol = false; } // Kick to login on fail if (!$pass_border_partrol) { $this->LOGOUT(); exit(); } } // Catch login, returns fail string or false if no errors public function CATCH_LOGIN() { if (filter_input(INPUT_POST, "id") == "login" && filter_input(INPUT_POST, "Verzenden") == "Verzenden") { // Variables from form. $email = filter_input(INPUT_POST, "email"); $sha512Pass = filter_input(INPUT_POST, "p"); // Database variables $db_accounts = mysqli_connect($this->mySQL_accounts_host, $this->mySQL_accounts_username, $this->mySQL_accounts_password, $this->mySQL_accounts_database); // Prepage sql if ($stmt = $db_accounts->prepare("SELECT account_id, verified, blocked ,login_email, login_password, login_salt, user_voornaam, user_tussenvoegsel, user_achternaam FROM accounts WHERE login_email = ? LIMIT 1")) { $stmt->bind_param(''s'', $email); // Bind "$email" to parameter. $stmt->execute(); // Execute the prepared query. $stmt->store_result(); $stmt->bind_result($user_id, $verified, $blocked, $email, $db_password, $salt, $voornaam, $tussenvoegsel, $achternaam); // get variables from result. $stmt->fetch(); $password = hash(''sha512'', $sha512Pass . $salt); // hash the password with the unique salt. $tussen = '' ''; if ($tussenvoegsel != "") { $tussen = " " . $tussenvoegsel . " "; } $username = $voornaam . $tussen . $achternaam; if ($stmt->num_rows == 1) { // If the user exists // Check blocked if ($blocked == "1") { return ''Deze acount is geblokkeerd, neem contact met ons op.''; } // We check if the account is locked from too many login attempts if ($this->_checkBrute($user_id, $db_accounts) == true) { // Account is locked // Send an email to user saying their account is locked return "Te vaak fout ingelogd,<br />uw account is voor " . $this->blockout_time . " minuten geblokkerd."; } else { if ($db_password == $password && $verified == 1) { // Password is correct!, update lastLogin if ($stmt = $db_accounts->prepare("UPDATE accounts SET date_lastLogin=? WHERE account_id=?")) { $lastlogin = date("Y-m-d H:i:s"); $stmt->bind_param(''ss'', $lastlogin, $user_id); // Bind "$email" to parameter. $stmt->execute(); $stmt->close(); } $ip_address = $_SERVER[''REMOTE_ADDR'']; // Get the IP address of the user. $user_browser = $_SERVER[''HTTP_USER_AGENT'']; // Get the user-agent string of the user. $user_id = preg_replace("/[^0-9]+/", "", $user_id); // XSS protection as we might print this value $_SESSION[''user_id''] = $user_id; $username = $username; // XSS protection as we might print this value $_SESSION[''username''] = $username; $_SESSION[''login_string''] = hash(''sha512'', $password . $ip_address . $user_browser); // Login successful. if ($this->MailOnLogin != FALSE) { mail($this->MailOnLogin, ''SECUREPLAY - LOGIN'', $username . '' logged in to the secureplay platform..''); } return false; } else { // Password is not correct // We record this attempt in the database $now = time(); $db_accounts->query("INSERT INTO login_attempts (userID, timestamp) VALUES (" . $user_id . ", " . $now . ")"); return "Onbekende gebruikersnaam en/of wachtwoord."; } } } else { return "Onbekende gebruikersnaam en/of wachtwoord."; } } else { return ''SQL FAIL! '' . mysqli_error($db_accounts); } return "Onbekende fout!"; } return false; } private function _checkBrute($user_id, $db_accounts) { // Get timestamp of current time $now = time(); // All login attempts are counted from the past 2 hours. $valid_attempts = $now - ($this->blockout_time * 60); if ($stmt = $db_accounts->prepare("SELECT timestamp FROM login_attempts WHERE userID = ? AND timestamp > $valid_attempts")) { $stmt->bind_param(''i'', $user_id); // Execute the prepared query. $stmt->execute(); $stmt->store_result(); // If there has been more than 5 failed logins if ($stmt->num_rows > $this->max_login_fails) { return true; } else { return false; } } else { return true; } } // Login Check if user is logged in correctly private function _login_check() { // Database variables $db_accounts = mysqli_connect($this->mySQL_accounts_host, $this->mySQL_accounts_username, $this->mySQL_accounts_password, $this->mySQL_accounts_database); // Check if all session variables are set if (isset($_SESSION[''user_id''], $_SESSION[''username''], $_SESSION[''login_string''])) { $user_id = $_SESSION[''user_id'']; $login_string = $_SESSION[''login_string'']; $username = $_SESSION[''username'']; $ip_address = $_SERVER[''REMOTE_ADDR'']; // Get the IP address of the user. $user_browser = $_SERVER[''HTTP_USER_AGENT'']; // Get the user-agent string of the user. if ($stmt = $db_accounts->prepare("SELECT login_password FROM accounts WHERE account_id = ? LIMIT 1")) { $stmt->bind_param(''i'', $user_id); // Bind "$user_id" to parameter. $stmt->execute(); // Execute the prepared query. $stmt->store_result(); if ($stmt->num_rows == 1) { // If the user exists $stmt->bind_result($password); // get variables from result. $stmt->fetch(); $login_check = hash(''sha512'', $password . $ip_address . $user_browser); if ($login_check == $login_string) { // Logged In!!!! return $user_id; } else { // Not logged in return false; } } else { // Not logged in return false; } } else { // Not logged in //die("f3"); return false; } } else { // Not logged in return false; } } }

secured_page

<?php require_once ''assets/class.Firewizz.Security.php''; if (!isset($SECURITY)) { $SECURITY = new Firewizz/Security(); } // Check if user is logged in or redirect to login page; $SECURITY->BORDER_PATROL(true, true); // CONTENT bla bla ?>

getPDF.php

<?php // Requires require_once ''assets/class.FirePDF.php''; require_once ''assets/class.Firewizz.Security.php''; $SECURITY = new /Firewizz/Security(); $SECURITY->Start_Secure_Session(); // Html file to scrape, if this works replace with referer so the page that does the request gets printed.(prepend by security so it can only be done from securePlay $html_file = ''http://www.website.nl/?p=overzichten&sort=someSort&s=67''; // Output pdf filename $pdf_fileName = ''Test_Pdf.pdf''; /* * cURL part */ // create curl resource $ch = curl_init(); // set source url curl_setopt($ch, CURLOPT_URL, $html_file); // set cookies $cookiesIn = "user_id=" . $_SESSION[''user_id''] . "; username=" . $_SESSION[''username''] . "; login_string=" . $_SESSION[''login_string''] . ";"; // set cURL Options $tmp = tempnam("/tmp", "CURLCOOKIE"); if ($tmp === FALSE) { die(''Could not generate a temporary cookie jar.''); } $options = array( CURLOPT_RETURNTRANSFER => true, // return web page //CURLOPT_HEADER => true, //return headers in addition to content CURLOPT_ENCODING => "", // handle all encodings CURLOPT_AUTOREFERER => true, // set referer on redirect CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect CURLOPT_TIMEOUT => 120, // timeout on response CURLOPT_MAXREDIRS => 10, // stop after 10 redirects CURLINFO_HEADER_OUT => true, CURLOPT_SSL_VERIFYPEER => false, // Disabled SSL Cert checks CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_COOKIEJAR => $tmp, //CURLOPT_COOKIEFILE => $tmp, CURLOPT_COOKIE => $cookiesIn ); // $output contains the output string curl_setopt_array($ch, $options); $output = curl_exec($ch); // close curl resource to free up system resources curl_close($ch); // output the cURL echo $output; ?>

Como probamos

Las pruebas actuales se realizan al iniciar sesión en el usuario e ir a la página correcta que queremos obtener con cURL y verificar que vea la página (que funciona). Ahora ejecutamos la página getPDF.php en una nueva pestaña. en el que vemos una página en blanco debido a la falla de seguridad. si añadimos echo "session data:" . $_SESSION["login_string"] echo "session data:" . $_SESSION["login_string"] ; en el script de seguridad vemos que las variables en la $ _SESSION están en blanco. Cuando getPDF.php la misma línea en el getPDF.php , vemos que se está configurando allí. Por lo que sabemos a ciencia cierta que no se ha transferido por cURL.

Alguna información corta.

  • Así que con el código anterior obtenemos una página en blanco;
  • $ _SESION datos no enviados;
  • Las cookies bastante seguras tampoco envían;
  • Probé varias configuraciones de CURL, ninguna con éxito de todos modos;
  • Sería perfecto si se pasaran TODOS los datos de $ _SESSION Y $ _COOKIE;
  • Intenté todo lo dicho en comentarios o respuestas.

Así que su $cookiesIn necesita tener sus cookies definidas. Haré un ejemplo basado en sus fragmentos de código:

$cookiesIn = "user_id=" . $_SESSION[''user_id''] . "; username=" . $_SESSION[''username''] . "; login_string=" . $_SESSION[''login_string''] . ";";

Intenta configurarlo en tu página de pdfCreator. Reemplace $cookiesIn = ""; con la línea de arriba y ver si eso te da un resultado diferente.

Además, aquí hay una gran referencia para la cookie opción cURL:

https://curl.haxx.se/libcurl/c/CURLOPT_COOKIE.html

Si desea que todas las cookies se envíen en lugar de designarlas, use este código:

$tmp = tempnam("/tmp", "CURLCOOKIE"); if($tmp === FALSE) die(''Could not generate a temporary cookie jar.''); $options = array( CURLOPT_RETURNTRANSFER => true, // return web page //CURLOPT_HEADER => true, //return headers in addition to content CURLOPT_ENCODING => "", // handle all encodings CURLOPT_AUTOREFERER => true, // set referer on redirect CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect CURLOPT_TIMEOUT => 120, // timeout on response CURLOPT_MAXREDIRS => 10, // stop after 10 redirects CURLINFO_HEADER_OUT => true, CURLOPT_SSL_VERIFYPEER => false, // Disabled SSL Cert checks CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_COOKIEJAR => $tmp, CURLOPT_COOKIEFILE => $tmp, );

Este código volcará todas las cookies actuales para uso en cURL, con la opción COOKIEJAR . Luego, cuando COOKIEFILE , COOKIEFILE dónde debería buscarse la COOKIEFILE para incluir cookies con la solicitud.

Dicho esto, me he deshecho de la referencia $cookiesIn ya que no debería ser necesaria si utiliza el código anterior.


En este caso, siempre que el algoritmo de control de sesión sea correcto, simplemente desea cambiar el formato en el que se envía la página.

Usar cURL para recuperar la página es una forma de hacerlo, pero parece un problema XY; en realidad no quiere usar cURL, quiere controlar el formato de salida, ya sea HTML o PDF.

Una opción viable sería volver a cargar la página después de agregar un parámetro específico que se inyectará en el contexto de la página y modificar la función de salida. Por ejemplo, podría envolver toda la página en una burbuja de búfer de salida:

// Security checks as usual, then: if (array_key_exists(''output'', $_GET)) { $format = $_GET[''output'']; // e.g. "pdf" // We could check whether the response handler has a printAs<FORMAT> method switch ($format) { case ''pdf'': $outputFn = ''printAsPDF''; break; default: throw new /Exception("Output in {$format} format not supported"); } ob_start($output); } // Page is generated normally

La salida ''printAsPDF'' recibirá el contenido de la página y usará algo como dompdf o wkhtml2pdf para formatearlo como un archivo PDF, agregar los encabezados de tipo de contenido apropiados y devolver el formato PDF.

La seguridad se mantiene igual, y la modificación puede implementarse en la etapa de decodificación de la solicitud. Una variable de estado con el formato de salida utilizado actualmente puede hacerse accesible a otros objetos, lo que les permite comportarse de manera diferente dependiendo de la situación (por ejemplo, una función generateMenu () puede elegir regresar inmediatamente en lugar de mostrar algo que no haría sentido en un PDF).


Ok esta resuelto

Después de mucha investigación.

Los datos de las cookies se pasan, pero eso no lo convierte en datos de sesión. Esto se solucionó con el siguiente método:

private function Cookie2Session($name) { if (filter_input(INPUT_COOKIE, $name)) { $_SESSION[$name] = filter_input(INPUT_COOKIE, $name); } } // following lines put within the BORDER_PATROL Method if (filter_input(INPUT_COOKIE, ''pdfCurl'')) { $this->Cookie2Session(''user_id''); $this->Cookie2Session(''username''); $this->Cookie2Session(''login_string''); $this->Cookie2Session(''REMOTE_ADDR''); $this->Cookie2Session(''HTTP_USER_AGENT''); $_SESSION[''new_session''] = "true"; }

Pequeña alteración al método _login_check()

// Login Check if user is logged in correctly private function _login_check() { // Database variables $db_accounts = mysqli_connect($this->mySQL_accounts_host, $this->mySQL_accounts_username, $this->mySQL_accounts_password, $this->mySQL_accounts_database); // Check if all session variables are set if (isset($_SESSION[''user_id''], $_SESSION[''username''], $_SESSION[''login_string''])) { $user_id = $_SESSION[''user_id'']; $login_string = $_SESSION[''login_string'']; $username = $_SESSION[''username'']; $ip_address = $_SERVER[''REMOTE_ADDR'']; // Get the IP address of the user. $user_browser = $_SERVER[''HTTP_USER_AGENT'']; // Get the user-agent string of the user. // =====>> add this code, because cURL req comes from server. <<===== if (isset($_SESSION["REMOTE_ADDR"]) && ($_SERVER[''REMOTE_ADDR''] == $_SERVER[''SERVER_ADDR''])) { $ip_address = $_SESSION["REMOTE_ADDR"]; } // {rest of code}

Pequeñas actualizaciones al archivo getPHP.php :

<?php // Requires require_once ''assets/class.FirePDF.php''; require_once ''assets/class.Firewizz.Security.php''; $SECURITY = new /Firewizz/Security(); $SECURITY->Start_Secure_Session(); // Html file to scrape, if this works replace with referer so the page that does the request gets printed.(prepend by security so it can only be done from securePlay $html_file = ''http://www.secureplay.nl/?p=overzichten&sort=SpeelplaatsInspecties&s=67''; // Output pdf filename $pdf_fileName = ''Test_Pdf.pdf''; /* * cURL part */ // create curl resource $ch = curl_init(); // set source url curl_setopt($ch, CURLOPT_URL, $html_file); // set cookies $cookiesIn = "user_id=" . $_SESSION[''user_id''] . "; username=" . $_SESSION[''username''] . "; login_string=" . $_SESSION[''login_string''] . "; pdfCurl=true; REMOTE_ADDR=" . $_SERVER[''REMOTE_ADDR''] . "; HTTP_USER_AGENT=" . $_SERVER[''HTTP_USER_AGENT'']; $agent = $_SERVER[''HTTP_USER_AGENT'']; // set cURL Options $tmp = tempnam("/tmp", "CURLCOOKIE"); if ($tmp === FALSE) { die(''Could not generate a temporary cookie jar.''); } $options = array( CURLOPT_RETURNTRANSFER => true, // return web page //CURLOPT_HEADER => true, //return headers in addition to content CURLOPT_ENCODING => "", // handle all encodings CURLOPT_AUTOREFERER => true, // set referer on redirect CURLOPT_CONNECTTIMEOUT => 120, // timeout on connect CURLOPT_TIMEOUT => 120, // timeout on response CURLOPT_MAXREDIRS => 10, // stop after 10 redirects CURLINFO_HEADER_OUT => true, CURLOPT_SSL_VERIFYPEER => false, // Disabled SSL Cert checks CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_COOKIEJAR => $tmp, //CURLOPT_COOKIEFILE => $tmp, CURLOPT_COOKIE => $cookiesIn, CURLOPT_USERAGENT => $agent ); // $output contains the output string curl_setopt_array($ch, $options); $output = curl_exec($ch); // close curl resource to free up system resources curl_close($ch); // output the cURL echo $output; ?>

Con el conocimiento anterior, puede utilizar totalmente cURL para visitar una página segura con los datos de la sesión actual con solo sesiones menores en su seguridad.