2011-06-28 14 views
5

Publiqué una pregunta similar antes, pero nunca recibí una respuesta que me ayudara, así que estoy tratando de intentarlo de nuevo. Como descargo de responsabilidad, sé que mucha de la información aquí no sigue las prácticas de codificación perfecta, pero es sólo para fines de ejercicio. Probé un millón de cosas y parece que nada funciona, ¡porque no estoy seguro de a dónde irá todo! Necesito desesperadamente alguna (¡cualquiera!) Ayuda, ¡así que gracias de antemano si puedes ofrecer algo!php cookies y variables de sesión y dirección IP

Estoy tratando de crear un formulario/página simple que use algunas cookies básicas y material de sesión para producir algunos datos específicos del usuario. Me estaba moviendo bien hasta que encontré algunos problemas que no puedo resolver. En mi primera página, todo está bien, excepto que solo quiero el NOMBRE del navegador que el usuario está usando. (Por ejemplo, quiero simplemente el título simple: Firefox en lugar de la versión completa del navegador.) He visto esto hecho, así que creo que es posible, ¡simplemente no sé cómo hacerlo!

Mis problemas reales aparecen aquí, porque no estoy muy seguro de cómo almacenar la dirección IP, la información del navegador y la fecha/hora actual (que quiero mostrar en la página 2) como variables de sesión. Intenté algunas cosas que encontré, pero no creo que lo haya hecho bien.

También trabajé sin parar tratando de almacenar el nombre de usuario y las contraseñas como dos cookies separadas cada una ... ¿sugerencias? Finalmente, ¿qué debo hacer para tener un encabezado de ubicación (usado para llamar a form_data.php) con buffer de salida?

(No estoy seguro de que esto sea tan útil, considerando que probablemente hice todo mal! LOL) Esta es una versión totalmente reducida de mi código. Intenté publicar mi versión más limpia, a pesar de que no tiene mucha información, para que pudieras ver fácilmente lo que estaba tratando de hacer.

principal código de archivo:

<?php 
header('Location: form_data.php'); 


setcookie('username', $_POST['username']); 
setcookie('password', $_POST['password']); 
//I know this isn't working. 
//honestly I just left this in here as to show where I had been 
//trying to save the cookie data. Pretty obvious how bad my 
//trial and error with this went! 

} 
?> 


<?php 

$_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
echo " By the way, your IP address is: </b>".$_SESSION['ip']."<br />"; 
echo " You already know this, but the browser you are currently using 
to view this page is:<br/>"; //What is the correct function that I should be using here? 
echo "<form action=\"form_data.php\" method=\"post\">"; 
echo "username:<input type=\"text\" name=\"username\" size=\"20\" value=\"\"><br/>"; 
echo "password:<input type=\"password\" name=\"password\" size=\"20\" value=\"\"><br/>"; 
echo "<input type=\"submit\" value=\"Submit, please\" />"; 
echo "<br /><input type=\"hidden\" name=\"submitted\" value=\"true\" />"; 
?> 

form_data.php

<?php 

    echo "Hello, ".$username;//I'm trying to get the cookie data for the username 
    echo "Your password is ".$password; //Samething here (want cookie data) 
    echo "The date and time you entered this form is: ".date("F j, Y")." -- ".date("g:i a"); 
    echo "<br/>Your IP:".$_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
    echo "<br/>Your broswer:".;//I want full broswer data here...dont know how to do it. 
    //Overall, was this the way to get the session variables for IP, date/time and browser? 
    echo "Thank you for filling out this form!"; 
    ?> 
+5

¡NO guarde su nombre de usuario y contraseña en las cookies! En su lugar, almacene una cadena al azar en la cookie para permitirle al usuario regresar más tarde al hacer coincidir un valor en la base de datos con el valor de la cookie, y regenere ese valor en cada carga de página. –

+1

No use 'setcookie', nunca. Simplemente use '$ _SESSION' y mantenga todos los datos relevantes para la sesión en el servidor. La única cookie que el cliente necesitará es la cookie de sesión, y usted no tiene que manejar eso explícitamente (además de regenerarla una vez que inicie sesión exitosamente para evitar la fijación). –

+0

@Kerrek SB Las cookies siguen siendo útiles para conservar información no confidencial más allá de la duración de la sesión del servidor. Sirven un propósito diferente que '$ _SESSION'. –

Respuesta

5

Para obtener el navegador, utilice la función get_browser():

$browserinfo = get_browser($_SERVER['HTTP_USER_AGENT']); 
$browsername = $browserinfo['browser']; 

Su sesión y de la galleta de almacenamiento nunca va a funcionar porque está haciendo una llamada header("Location"); antes de intentar se t cookies. No puede enviar ningún resultado antes de establecer cookies o establecer una sesión.

Antes de cualquier salida a la pantalla, llame al session_start();

// attach to your session (or create if it doesn't exist) 
// You must call session_start() on every page where you intend to access or set session vars 
// and it must be called before any output (including whitespace at the top) 
session_start(); 

// Store some stuff... 
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 

// Store user info in session, not cookie 
$_SESSION['username'] = $_POST['username']; 

// Set a cookie 
// Not a super secure token, but better than user/pass in cookies. 
// Point here is just to show that it must be done before any output or before the redirection header. 
$_SESSION['token'] = sha1(time() . rand() . $_SERVER['SERVER_NAME']); 
setcookie('token', $_SESSION['token']); 
// In practice, you'd want to store this token in a database with the username so it's persistent. 

// Now do the redirection: 
// Supposed to be an absolute URL by the HTTP spec 
header("Location: http://example.com/form_data.php"); 

// exit right after the redirection to prevent further processing. 
exit(); 

suplemento después de que los comentarios

mientras trabaja, fabricar pantallas PHP de que todos los errores que aparecen en pantalla. Asegúrese de desactivar display_errors cuando su código vaya a un servidor público en vivo.

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

para recuperar los valores de las cookies como usted ha dicho en su pregunta que no sabía cómo hacerlo, utilice el $_COOKIE superglobal:

// On the page that sets it... 
setcookie('somename', 'somevalue', expiry, domain); 

// On the page that retrieves it... 
echo $_COOKIE['somename']; 
+0

Wow. ¡Gracias por eso! ... Mirar tu código es un poco abrumador para mí, pero realmente estoy tratando de aprender sobre la marcha (algo nuevo en PHP). Entonces, ¿tengo que eliminar por completo mi primer código original? ¿O debo agregar los elementos que ha presentado a mi archivo? Me parece que cuando intento combinar incluso algunos de mis propios códigos, me meto en problemas y todo deja de funcionar ... :( – clk

+0

@clk Intenta integrar mi código en el tuyo. La parte importante para recordar es llamar a 'session_start()' en la parte superior de cada página. Luego, tendrás acceso a todo lo almacenado allí mediante '$ _SESSION'. Asegúrate de haber activado' display_errors' (ver arriba) mientras trabajas para que puedas ver qué está fallando y por qué. –

4
> I'm trying to create a simple form/
> page that uses some basic cookie and 
> session stuff to produce some 
> user-specific data. 

Sesiones usan los cookies debajo de la tapa (solo almacene session_id dentro de cookie/set_cookie) y le aconsejo que use solo sesiones porque las cookies pueden filtrar información (almacenar toda la información dentro de la cookie en la computadora de ese usuario) lo cual podría ser peligroso mientras la sesión usa el el sistema de archivos/base de datos del servidor o lo que quiera cuando anula session_set_save_handler.


> On my first page everything is good 
> except for I just want the NAME of the 
> browser the user is using. 

Como Michael dijo que se puede utilizar get_browser para ello:

intentos para determinar las capacidades del navegador del usuario, por mirar hacia arriba la información del navegador en las browscap.ini archivo.

igual que la página PHP dice que trata de determinar y debe NO confiar en esta información para cualquier cosa importante, ya que puede estar equivocado (se puede engañar al sistema, si lo desea). Lo que quiero decir es que no deberías usarlo para validar/probar algo.


> My real problems come up right about 
> here, because I’m not exactly sure how 
> to store the IP address, browser info 
> and the current date/time (which I 
> want shown on page 2) as session 
> variables. 

Más información para retrieve the IP address se puede leer aquí (servidor proxy podría engañarle un poco tal vez?). Para almacenar esa información simplemente almacénela dentro de una sesión emitiendo primero session_start() en la parte superior de cada página (antes de enviar cualquier cosa) que quiera usar sesiones (solo las que no configuran cookies en cada página lo que hace que la página sea un poco más lenta) y luego guarde hora actual dentro de una variable de sesión haciendo algo similar a $_SESSION['time'] = date(DATE_RFC822);. Puede leer más sobre cómo recuperar el tiempo en la página date().

Así que el código de page 1 se ve algo como:

<?php 

session_start(); 

$_SESSION['ip'] = getRealIpAddr(); # no php function => See http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html 
$_SESSION['time'] = date(DATE_RFC822); 

Luego, el page 2 se podía recuperar esta información usando algo como:

<?php 

session_start(); 

echo $_SESSION['ip']; // retrieve IP 

> I also worked endlessly on trying to 
> store the username and passwords as 
> two separate cookies 
> each...suggestions? 

No los guarde en el interior de una galleta (sólo usando set_cookie y no usar sesiones para almacenar información), sino almacenarlos dentro de una sesión para una mayor seguridad. Pero las sesiones también son vulnerables a session fixation por lo que después de almacenar algo crítico dentro de su sesión debe regenerate session idy nunca mostrar/mostrar esa información al navegador/usuario para evitar cualquier fuga.


> Finally, what do I need to do to have 
> a location header (used to call 
> form_data.php) with output buffering? 

Al igual que Michael dijo que usted debe utilizar header función y exit de interrumpir la escritura después de que

<?php 
header("Location: http://www.example.com/"); /* Redirect browser */ 

/* Make sure that code below does not get executed when we redirect. */ 
exit; 
?> 

PD: Nunca almacene cualquier información muy sensible como tarjeta de crédito (el uso paypal o algo así) números o cualquier cosa en su propia base de datos. También le aconsejo que no almacene contraseñas dentro de su base de datos, pero use algo como openId (Google's) por ejemplo para manejar su autenticación para mayor seguridad.

+0

Como se dijo en los comentarios de su enlace con respecto a 'getRealIpAddr();', la suplantación de HTTP_CLIENT_IP o HTTP_X_FORWARDED_FOR es trivial. Y así '$ _SERVER ['REMOTE_ADDR']' es más seguro. O haga un seguimiento de los tres valores ... para que pueda puede forzar la reautenticación en cualquier cambio. –

Cuestiones relacionadas