PHP куки и переменные сессии и IP-адрес - PullRequest
5 голосов
/ 28 июня 2011

Я уже публиковал похожий вопрос, но так и не получил ответ, который мне помог, поэтому я пытаюсь повторить попытку.Как заявление об отказе от ответственности, я знаю, что большая часть информации здесь не соответствует идеальной практике кодирования, но она предназначена только для целей упражнений.Я перепробовал миллион вещей, и ничего, похоже, не работает, потому что я не совсем уверен, куда все должно идти!Мне отчаянно нужна некоторая (любая!) Помощь, поэтому заранее спасибо, если вы можете что-нибудь предложить!

Я пытаюсь создать простую форму / страницу, которая использует некоторые базовые файлы cookie и сеансы для создания пользовательскихданные.Я шел хорошо, пока не столкнулся с несколькими проблемами, которые я не могу понять.На моей первой странице все хорошо, за исключением того, что я просто хочу ИМЯ браузера, который использует пользователь.(например, я хочу просто простое название: Firefox вместо всей длинной версии браузера.) Я видел, как это было сделано, поэтому я думаю, что это возможно, я просто не знаю, как это сделать!

Мои настоящие проблемы возникают именно здесь, потому что я не совсем уверен, как сохранить IP-адрес, информацию браузера и текущую дату / время (которые я хочу показать на странице 2) в качестве переменных сеанса.Пробовал несколько вещей, которые я нашел, но я не думаю, что делал все правильно.

Я также бесконечно работал над попыткой сохранить имя пользователя и пароли в виде двух отдельных файлов cookie для каждого ... предложения?Наконец, что мне нужно сделать, чтобы иметь заголовок местоположения (используемый для вызова form_data.php) с буферизацией вывода?

(Не уверен, что это будет полезным, учитывая, что я, вероятно, все сделал неправильно!это полностью урезанная версия моего кода.Пытался опубликовать мою самую чистую версию, хотя в ней не так много информации, чтобы вы могли легко увидеть, что я пытался сделать.

код основного файла:

<?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!"; 
   ?> 

Ответы [ 2 ]

5 голосов
/ 28 июня 2011

Чтобы получить браузер, используйте функцию get_browser():

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

Ваше хранилище сеансов и файлов cookie никогда не будет работать, поскольку вы делаете вызов header("Location"); до попыткиустановить куки.Вы не можете отправить какие-либо выходные данные до установки файлов cookie или установления сеанса.

Перед любым выводом на экран, позвоните 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();

ADDENDUM после комментариев

Во время работы убедитесь, что PHP отображает все ошибки на экране.Обязательно отключайте display_errors, когда ваш код поступает на открытый общедоступный сервер.

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

Чтобы извлечь значения из файлов cookie, как вы сказали в своем вопросе, вы не знали, как это сделать, используйте $_COOKIE суперглобальный:

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

// On the page that retrieves it...
echo $_COOKIE['somename'];
4 голосов
/ 28 июня 2011
> I'm trying to create a simple form /
> page that uses some basic cookie and
> session stuff to produce some
> user-specific data.

Сессии используют куки под крышкой (только хранилище session_id внутри куки / set_cookie ), и я советую вам использовать только сессии, потому что куки могут пропускать информацию (храните всю информацию в cookie на компьютере этого пользователя), что может быть опасно, когда сеанс использует файловую систему / базу данных сервера или что угодно, когда вы переопределяете 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.

Как Майкл сказал, что вы можете использовать get_browser для этого:

попытки определить возможности браузера пользователя, глядя вверх информация браузера в Файл browscap.ini.

Подобно тому, как на странице PHP говорится, что она пытается определить, и вы должны НЕ полагаться на эту информацию для чего-то важного, потому что она может быть неправильной (вы можете обмануть систему, если хотите). Я имею в виду, что вы не должны использовать это для подтверждения или подтверждения чего-либо.


> 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.

Более подробную информацию о получении IP-адреса можно прочитать здесь (прокси-сервер может немного вас ввести в заблуждение, может быть?). Чтобы сохранить эту информацию, просто сохраните ее внутри сеанса, сначала введя session_start() в верхней части каждой страницы (перед выводом чего-либо), который хочет использовать сеансы (только те, которые не устанавливают файлы cookie на каждой странице, что делает страницу немного медленнее) и затем сохранить текущее время внутри переменной сеанса, выполнив что-то вроде $_SESSION['time'] = date(DATE_RFC822);. Подробнее о получении времени можно прочитать на странице date () .

Итак, код на page 1 выглядит примерно так:

<?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);

Затем на page 2 вы можете получить эту информацию, используя что-то вроде:

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

Не храните их внутри куки (только используя set_cookie и не используя сеансы для хранения информации), но храните их внутри сессии для дополнительной безопасности. Но сеансы также уязвимы для фиксации сеанса , поэтому после сохранения чего-то критического в вашем сеансе вы должны восстановить идентификатор сеанса и никогда не выводить / показывать эту информацию в браузер / пользователь, чтобы предотвратить любую утечку.


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

Как сказал Майкл, вы должны использовать функцию header и exit для завершения сценария после этого

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

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

P.S. Никогда не храните действительно конфиденциальную информацию, такую ​​как номера кредитных карт (используйте PayPal или что-то), или что-либо еще в вашей собственной базе данных. Я также советую вам не хранить пароли внутри вашей базы данных, а использовать что-то вроде openId ( Google's ), например, для обработки вашей аутентификации для дополнительной безопасности.

...