php cookie 和会话变量和 ip 地址

Posted

技术标签:

【中文标题】php cookie 和会话变量和 ip 地址【英文标题】:php cookies and session variables and ip address 【发布时间】:2011-09-23 22:42:23 【问题描述】:

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

我正在尝试创建一个简单的表单/页面,它使用一些基本的 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!"; 
   ?> 

【问题讨论】:

不要将您的用户名和密码存储在 cookie 中!而是在 cookie 中存储一些随机字符串,以便用户稍后通过将数据库中的值与 cookie 值匹配来返回,并在每次页面加载时重新生成该值。 永远不要使用setcookie。只需始终使用$_SESSION 并维护与服务器上的会话相关的所有数据。客户端需要的唯一 cookie 是会话 cookie,您不必显式处理它(除了在成功登录后重新生成一次以避免固定)。 @Kerrek SB Cookies 对于在服务器会话生命周期之外保留非敏感信息仍然有用。它们的用途与 $_SESSION 不同。 【参考方案1】:

要获取浏览器,请使用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();

cmets 后的附录

在您工作时,请确保 PHP 在屏幕上显示所有错误。当您的代码进入实时公共服务器时,请务必关闭 display_errors

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

如您在问题中所说,您不知道如何从 cookie 中检索值,请使用 $_COOKIE superglobal:

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

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

【讨论】:

哇。感谢那! ... 看你的代码对我来说有点不知所措,但我真的在努力学习(对 PHP 来说很新)。那么,我是否需要完全废弃我的第一个原始代码或者我应该将您提供的元素添加到我的文件中?我发现,当我尝试结合自己的一些代码时,我遇到了麻烦,一切都停止了工作...... :( @clk 尝试将我的代码集成到您的代码中。要记住的重要部分是在每一页的顶部调用session_start()。然后,您将可以通过$_SESSION 访问您存储在那里的任何内容。确保您在工作时已打开 display_errors(见上文),以便了解失败的原因和原因。【参考方案2】:
> I'm trying to create a simple form /
> page that uses some basic cookie and
> session stuff to produce some
> user-specific data.

会话确实在封面下使用cookies(仅将session_id 存储在cookie/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:切勿在您自己的数据库中存储任何真正敏感的信息,例如信用卡(使用 paypal 或其他东西)号码或任何东西。我还建议您不要将密码存储在数据库中,而是使用诸如 openId(Google's) 之类的东西来处理您的身份验证以提高安全性。

【讨论】:

正如您在链接的 cmets 中关于 getRealIpAddr(); 所说,欺骗 HTTP_CLIENT_IP 或 HTTP_X_FORWARDED_FOR 是微不足道的。因此$_SERVER['REMOTE_ADDR'] 更安全。或者跟踪所有三个值。这样您就可以对任何更改强制重新进行身份验证。

以上是关于php cookie 和会话变量和 ip 地址的主要内容,如果未能解决你的问题,请参考以下文章

如何将IP地址保存在数据库中[关闭]

在屏幕会话中访问 SSH 客户端 IP 地址

公用一个ip地址cookie相同么?

Session详解

Nginx 会话保持

PayPal cookie 是不是与 IP 地址相关联?