我的会话没有建立

时间:2018-07-12 20:42:20

标签: php session

如标题中所述,我的会话未创建,是否可能是我是已经进行会话的域的子域?

这是我的php代码:

if(isset($_POST['login']))
{
    global $conn;

    $id = trim ($_POST ['identifiant']);

    $pass = trim ($_POST ['pass']);
    $pass = strip_tags ($pass);
    $pass = htmlspecialchars ($pass);
    $password = (hash ('sha1', $pass));

    $query = $conn->query("SELECT id, identifiant, password FROM tablename WHERE identifiant='$id'");
    $data = $query->fetch(PDO::FETCH_ASSOC);
    $count = $query->rowCount();

    if(($count == 1) && ($data['password']==$password))
    {
        session_start();
        $_SESSION['user'] = $id;
        header("Location: home.php");
    }
    else
    {
        echo 'Erreur';
    }
}

这是我的html代码:

<form class="form-login" method="post" wfd-id="5">
     <center><img src="assets/img/logo.png" class="form-login-heading"></center>
     <div class="form-group">
         <input type="text" name="identifiant" class="form-control" placeholder="Identifiant" style="text-align: center;" maxlength="6"; required="">
     </div>

     <div class="form-group">
         <input type="password" name="pass" class="form-control" placeholder="Mot de passe" required="" style="text-align: center;">
     </div>

     <div class="form-group">
         <button type="submit" name="login" class="btn btn-login btn-block">Connexion</button> 
     </div>
</form>

home.php:

if(!isset($_SESSION['user'])){
   //header('Location: index.php');
    echo 'Session:'.$_SESSION['user'];
}

1 个答案:

答案 0 :(得分:1)

我发现您的代码存在一些问题,其中一个将负责...可能是最后一个。

问题1:安全性

您愿意接受SQL注入。 trim不能阻止这一点。请了解准备好的声明。我对此特别强调,尤其是使用登录表单。

还请使用password_hash为数据库中的值创建存储的哈希,并使用password_verify验证输入的密码是否正确。如果您的用户表被盗用(很可能是由于您进行了sql注入),那么Rainbow表将提供对用户帐户的轻松访问(更轻松?)。

问题2:奇怪的假设

fetch加上rowCount。您绝对不需要两者。您的假设是什么?

如果您认为结果行可能多于1 ,则您的数据库架构存在缺陷。该字段应标记为UNIQUE。如果在唯一字段中选择,则将永远不会有一个结果。 (也identificant建议最多应该有1个,因此唯一是合适的)

如果您认为结果行可能没有,那么如果没有该行,那么您的fetch将只返回null / false,然后检查为此。

php文档也指出,在rowCount语句上调用select可能不会返回您想要的内容,而应该进行select COUNT(*)查询(还有注释的重新声明在select语句之后获取计数的唯一方法是调用一个单独的select count(*) ...语句或计算fetch的返回值-本质上就是这样。

问题3:重定向而不返回?

这仅是理论上的。在header之后,您应该通过返回/退出来结束请求,然后再生成更多输出并使标头无效。 (重定向+输出->输出+错误消息(可能))

问题4:isset混乱

if(!isset($_SESSION['user'])){
   //header('Location: index.php');
    echo 'Session:'.$_SESSION['user'];
}

仅当 no 用户存储在$_SESSION中时,此命令才会输出某些内容。删除!或将isset替换为empty