php cookie和会话变量以及ip地址

时间:2011-06-28 01:24:07

标签: php session variables cookies

之前我发过一个类似的问题,但从来没有真正得到过帮助我的答案,所以我想再试一次。作为免责声明,我知道这里的许多信息并不遵循完美的编码习惯,但它仅用于练习目的。我已经尝试了一百万件事,似乎没有什么工作,因为我不确定应该去哪里!我迫切需要一些(任何!)帮助,所以如果你能提供任何东西,请提前感谢!

我正在尝试创建一个简单的表单/页面,它使用一些基本的cookie和会话内容来生成一些特定于用户的数据。我一直在努力,直到遇到一些我无法弄清楚的问题。在我的第一页上一切都很好,除了我只想要用户正在使用的浏览器的名称。 (例如,我只想要简单的标题:Firefox而不是浏览器的整个长版本。)我已经看到这样做了所以我认为这是可能的,我只是不知道该怎么做!

我真正的问题出现在这里,因为我不确定如何将IP地址,浏览器信息和当前日期/时间(我希望在第2页上显示)存储为会话变量。尝试了一些我找到的东西,但我不认为我做得对。

我还无休止地尝试将用户名和密码存储为两个单独的cookie,每个...建议?最后,我需要做些什么来获得带有输出缓冲的位置标头(用于调用form_data.php)?

(不确定这会有所帮助,考虑到我可能做错了什么!LOL)这是我的代码的完全精简版本。试图发布我最干净的版本,即使它没有太多的信息,所以你可以很容易地看到我想要做的事情。

主文件代码:

<?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 个答案:

答案 0 :(得分:5)

要获取浏览器,请使用get_browser()功能:

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

您的会话和Cookie存储将无法正常工作,因为您在尝试设置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'];

答案 1 :(得分:4)

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

会话确实在封面下使用cookies(仅在Cookie / session_id内存储set_cookie)我建议您仅使用会话,因为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.

Michael一样,您可以使用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.

可以在此处阅读retrieve the IP address的更多信息(代理服务器可能会误导您一点点?)。要存储该信息,只需将其存储在会话中,方法是首先在每个页面上(在输出任何内容之前)发布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?

不要将它们存储在cookie中(仅使用set_cookie而不使用会话来存储信息),而是将它们存储在会话中以提高安全性。但会话也容易受session fixation影响,因此在您的会话中存储重要内容之后,您应该regenerate session id 并且永远不会向浏览器/用户输出/显示该信息以防止任何泄漏。


> 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:永远不要在您自己的数据库中存储任何真正敏感的信息,如creditcard(使用paypal或其他)数字或任何东西。我还建议您不要在数据库中存储密码,而是使用openId(Google's)之类的东西来处理您的身份验证以获得额外的安全性。