Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP高级安全会话类_Php_Mysql_Security_Session_Login - Fatal编程技术网

PHP高级安全会话类

PHP高级安全会话类,php,mysql,security,session,login,Php,Mysql,Security,Session,Login,在一次实习中,我正在跟随一个非常好的教程,为购物车制作高级PHP安全会话,为用户提供个人级别的定价(无论如何,这就是目标) 以下是教程: 首先,为了测试此会话,我创建了一个基本登录名,该登录名基于Quickbooks客户ID检查现有客户。真正的交易使用注册、登录和密码。然后我做了一个登录检查器,在mysql数据库中查找用户,找到后,检索需要逐页保留在用户中的用户数据列。(我保证在我完成这项工作后,我将进一步阻止SQL注入。)我添加了一些额外的字段以存储在SessionData中 <?ph

在一次实习中,我正在跟随一个非常好的教程,为购物车制作高级PHP安全会话,为用户提供个人级别的定价(无论如何,这就是目标)

以下是教程:

首先,为了测试此会话,我创建了一个基本登录名,该登录名基于Quickbooks客户ID检查现有客户。真正的交易使用注册、登录和密码。然后我做了一个登录检查器,在mysql数据库中查找用户,找到后,检索需要逐页保留在用户中的用户数据列。(我保证在我完成这项工作后,我将进一步阻止SQL注入。)我添加了一些额外的字段以存储在SessionData中

<?php
    include "class.session.php";

    if(empty($_POST['customer_id']))
    {
        $this->HandleError("Customer ID is empty!");
        return false;
    }

    $customer_id = trim($_POST['customer_id']);
    $dbuser = "CENSORED";
    $dbpass = "CENSORED";
    $host = "localhost";
    $dbname = "CENSORED";

// database connection 
mysql_connect("localhost", $dbuser, $dbpass) or die(mysql_error());
mysql_select_db($dbname) or die("Unable to select database");

//This query grabs all the puchases going back up to three months
//This debug line displays the query
$query = "SELECT * FROM customers";
echo $query."<br>";

$found = 0;
$result = mysql_query($query);
while($row=mysql_fetch_array($result))
{
    //Grab the database pieces the customer will need throughout the page.
    echo "Checking customer number ".$row['customer_id']."<br>";
    if ($row['customer_id'] == $customer_id)
    {
        $found = 1;
        break;
    }

}

//-create while loop and loop through result set
if ($found == 0)
{
    echo 'Wrong customer number';
}

while($row=mysql_fetch_array($result))
{
    //Grab the database pieces the customer will need throughout the page.
    $customer_id = $row['customer_id'];
    $first_name = $row['first_name'];
    $last_name = $row['last_name'];
    $first_name = $row['price_level'];
}

//Give the user a session.
$sessions = new sessionsClass;
$sessions->_sessionStart();

$sessionInfo = $sessions->sessionCheck();

if( $sessionInfo = false )
{
      # This session is invalid. Tell the user.
}
else
{
      # Update the name.
      $sessionInfo->sessionData['customer_id'] = $customer_id;
      $sessionInfo->sessionData['company_name'] = $company_name;
      $sessionInfo->sessionData['first_name'] = $first_name;
      $sessionInfo->sessionData['last_name'] = $last_name;
      $sessionInfo->sessionData['price_level'] = $price_level;
      $sessionInfo->setSessionData();
      # Session is valid, can use the data.
      echo "Your name is ".$sessionInfo->sessionData['first_name']." ".$sessionInfo->sessionData['last_name']."<br>";
}

?>
我的最后一个问题是,无论是哪个页面,每个页面都需要什么来安全区分普通用户和登录用户?是这样的吗

if (sessionCheck == false)
{show ordinary stuff}
else if (sessionCheck == return true)
{show personalized stuff}
毕竟,编辑本教程似乎有一些问题。例如,在本教程末尾附近

# Session is valid, can use the data.
      echo "Your name is " . $sessionInfo->sessionData['fullname'];

      # Update the name.
      $sessionInfo->sessionData['fullname'] = "My New name";

      $sessionInfo->setSessionData();
}
这是错误的,因为sessionInfo是一个布尔值,意味着返回true表示false。相反,我用

$sessions->sessionData['customer_id'] = $customer_id;
$sessions->sessionData['company_name'] = $company_name;
$sessions->sessionData['first_name'] = $first_name;
$sessions->sessionData['last_name'] = $last_name;
$sessions->sessionData['price_level'] = $price_level;
$sessions->setSessionData();

但这仍然没有奏效。此外,本教程让人们创建一个完整的MySQL数据库,但在类或教程中的任何地方都不会发生一次插入。现有会话的更新查询功能已经存在,但没有创建新会话的功能。要使数据库成功创建会话,我可以添加哪些内容?

如果在非序列化过程中找不到该类,则序列化对象将转换为
stdClass
。我的猜测是,当您从数据库读取会话信息并试图将其放回
sessionClass
对象时,您没有包含定义该类的文件。在取消序列化之前,请确保已定义该类

由于
stdClass
没有名为
setSessionData
的方法,因此会出现“调用未定义的方法”错误。方法是一个术语,通常用于指代类中的函数,而函数只是一个独立的函数定义

要在每个页面上区分登录用户和普通用户,通常需要启动会话并检查特定于应用程序的值,该值指示用户已通过身份验证。这可以简单到在会话中设置
loggedIn
标志,或者存储更复杂的类型并检查其值。但基本上,您需要在每个页面上执行此操作,以了解普通用户和登录用户

希望有帮助


另外,您正在调用
$this->HandleError(“客户ID为空!”)
在代码的开头,如果执行该块,则会出现一个错误,说明
$this
未定义。由于没有在类中调用该代码,因此没有
$this
的实例,因此您必须找出正确的方法来处理该错误。

此“安全”会话类有一个in
setSessionData
,因为会话ID使用时没有正确转义,可能来自cookie。哇,我从来都不知道那是关于序列化的。因为类本身正在执行序列化和非序列化,所以类可以“包含自身”吗?登录肯定包含类文件。至于HandleError,该代码很旧。现在我已经用一个原始的回声来代替它了。我绝对不能让这个类包含它自己的文件。这个类的另一个问题是,在教程的任何地方都没有发生任何类型的mysql插入。我不知道该类是否需要执行插入,或者该插入应该发生在登录脚本中。
$sessions->sessionData['customer_id'] = $customer_id;
$sessions->sessionData['company_name'] = $company_name;
$sessions->sessionData['first_name'] = $first_name;
$sessions->sessionData['last_name'] = $last_name;
$sessions->sessionData['price_level'] = $price_level;
$sessions->setSessionData();