【问题标题】:how can i share data between PHP pages?如何在 PHP 页面之间共享数据?
【发布时间】:2010-02-24 01:21:11
【问题描述】:

我有一个 PHP 页面,我想在页面之间共享一些数据,例如用户 ID、密码。

我正在学习会话,但我不确定我是否正确使用它。

<?php
require_once('database.inc');
$kUserID = $_POST['kUserID'];
$kPassword = $_POST['kPassword'];

if (!isset($kUserID) || !isset($kPassword)) { 
    header( "Location: http://domain/index.html" ); 
}

elseif (empty($kUserID) || empty($kPassword)) { 
    header( "Location: http://domain/index.html" ); 
} 
else { 
    $user = addslashes($_POST['kUserID']); 
    $pass = md5($_POST['kPassword']); 
    $db = mysql_connect("$sHostname:$sPort", $sUsername, $sPassword) or die(mysql_error()); 
    mysql_select_db($sDatabase) or die ("Couldn't select the database."); 
    $sqlQuery = "select * from allowedUsers where UserID='" . $kUserID . "' AND passwordID='" . $kPassword . "'";
    $result=mysql_query($sqlQuery, $db);
    $rowCheck = mysql_num_rows($result); 
    if($rowCheck > 0){ 
        while($row = mysql_fetch_array($result)){
            session_start();
            session_register('kUserID'); 
            header( "Location: link.php" );
       } 
    } 
    else { 
        echo 'Incorrect login name or password. Please try again.'; 
    } 
} 
?> 

【问题讨论】:

  • 橙子,请清理你的代码sn-p。把它从所有不相关的东西中剥离出来,并准确地向我们展示你想要对会话做什么。代码太多,而且缩进不好 - 在这里弄清楚你要做什么并不好玩。
  • 好的。我做了你所要求的。如何在页面之间共享数据。

标签: php mysql session


【解决方案1】:

为了所有神圣的爱,don't use addslashes to prevent SQL injection

我刚刚拥有您的网站:

Image of your ownt site http://localhostr.com/files/8f996b/Screen+shot+2010-02-23+at+7.49.00+PM.png

编辑:更糟。

我刚刚注意到您试图通过 addlashes 防止注入,甚至没有被使用!

<?php
$kUserID = $_POST['kUserID'];
$user = addslashes($_POST['kUserID']); // this isn't used
$sqlQuery = "select * from allowedUsers where UserID='"
  . $kUserID . "' AND passwordID='" . $kPassword . "'";

【讨论】:

  • 那么,使用 SQL 注入攻击将数据添加到数据库中,然后通过相同的机制在另一个页面上检索它算作在页面之间保存数据的可行方法吗?哎呀。好在代码很早就在这里发布了。
  • 这里是你应该使用的函数的链接,而不是 addlashes php.net/manual/en/function.mysql-real-escape-string.php
  • 未来的注意事项..转义对 SQL 注入也无用...相反,请使用准备好的语句。
【解决方案2】:

请注意 session_register() 已被弃用,有利于将值分配给 $_SESSION 超全局,例如

<?php
    $_SESSION['hashedValue']= '437b930db84b8079c2dd804a71936b5f';
?>

还要注意,存储在会话中的任何内容,尤其是在共享服务器环境中,都是公平的游戏。永远不要存储密码,无论是散列还是加密。我也会避免存储用户名。如果您必须使用会话变量在页面之间使用某种身份验证机制,我建议使用第二个查找表,例如logins,并将用户名、登录时间等存储在该表中。该表的散列值存储在会话中,每个页面请求都会检查表中的时间以及针对数据库的散列值。如果请求太旧或哈希不匹配,请强制重新登录。

您可以通过PHP manual section on sessions 获得所有这些以及更多信息。

【讨论】:

    【解决方案3】:

    您可能还想将“database.inc”重命名为“database.inc.php”,或者正确设置您的主机以将“.inc”视为 PHP:

    http://www.namemybabyboy.com/database.inc

    <?php
        $sDatabase = 'shayaanpsp';
        $sHostname = 'mysql5.brinkster.com';
        $sPort     = 3306;
        $sUsername = 'shayaanpsp';
        $sPassword = 'XXXX';
        $sTable    = 'allowedUsers';
    ?>
    

    【讨论】:

    • 哈哈。他的密码也在我的几个密码字典中。
    【解决方案4】:

    首先,您需要将session_start() 放在脚本的开头。它还需要在每个使用会话数据的脚本的开头进行。所以它也会出现在 babyRegistration.php 的顶部。

    其次,我强烈建议不要使用session_register(),因为它依赖于register_globals,出于安全原因,默认情况下它是关闭的。您可以在此处阅读更多信息:http://php.net/manual/en/security.globals.php。您可以使用$_SESSION 超全局添加/访问会话变量:

    $_SESSION['kUserID'] = $kUserID;
    

    最后,与会话无关,只是一个观察,顶部的 isset 检查是多余的;如您所料,empty 将为未设置/NULL 变量返回 true。

    【讨论】:

      【解决方案5】:

      在页面顶部

      session_start();
      $_SESSION['yourvarname']='some value';
      

      然后在其他页面上检索

      echo $_SESSION['yourvarname'];
      // some value
      

      哦,关于注入,在进入数据库的所有内容上使用它 http://us3.php.net/manual/en/function.mysql-real-escape-string.php

      【讨论】:

      • @dperry> 很好的例子,但没有像 sessionStart() 这样的函数。
      • 请停止提倡使用旧的mysql功能。用 PDO 教新人正确的做事方式php.net/pdo
      • 我个人使用 mysqlli us.php.net/manual/en/class.mysqli.php 所以在这种情况下它将是 $mysql_li_instance->real_escape_string( $value );通过 real_escape_string 过滤器传递所有传入字符串的相同概念
      【解决方案6】:

      只是因为几乎所有事情都变成了避免 SQL 注入。转义字符串不会使您免于 SQL 注入。正确的方法是使用准备好的语句。 https://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-13
        • 1970-01-01
        • 2019-12-20
        • 1970-01-01
        • 2016-07-10
        相关资源
        最近更新 更多