如标题中所述,我的会话未创建,是否可能是我是已经进行会话的域的子域?
这是我的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'];
}
答案 0 :(得分:1)
我发现您的代码存在一些问题,其中一个将负责...可能是最后一个。
您愿意接受SQL注入。 trim
不能阻止这一点。请了解准备好的声明。我对此特别强调,尤其是使用登录表单。
还请使用password_hash
为数据库中的值创建存储的哈希,并使用password_verify
验证输入的密码是否正确。如果您的用户表被盗用(很可能是由于您进行了sql注入),那么Rainbow表将提供对用户帐户的轻松访问(更轻松?)。
fetch
加上rowCount
。您绝对不需要两者。您的假设是什么?
如果您认为结果行可能多于1 ,则您的数据库架构存在缺陷。该字段应标记为UNIQUE
。如果在唯一字段中选择,则将永远不会有一个结果。 (也identificant
建议最多应该有1个,因此唯一是合适的)
如果您认为结果行可能没有,那么如果没有该行,那么您的fetch
将只返回null
/ false
,然后检查为此。
php文档也指出,在rowCount
语句上调用select
可能不会返回您想要的内容,而应该进行select COUNT(*)
查询(还有注释的重新声明在select语句之后获取计数的唯一方法是调用一个单独的select count(*) ...
语句或计算fetch
的返回值-本质上就是这样。
这仅是理论上的。在header
之后,您应该通过返回/退出来结束请求,然后再生成更多输出并使标头无效。 (重定向+输出->输出+错误消息(可能))
if(!isset($_SESSION['user'])){
//header('Location: index.php');
echo 'Session:'.$_SESSION['user'];
}
仅当 no 用户存储在$_SESSION
中时,此命令才会输出某些内容。删除!
或将isset
替换为empty