我从其他一个项目中获取了一个登录脚本,并为我当前的项目设置了它。创建数据库(没有托管)并将文件上传到FTP
后,我转到了INDEX
页面,但在尝试登录一次后,错误的详细信息没有发生任何事情,通常它应该显示消息说'不正确的凭据',但它没有。我在代码中的不同位置设置了echo
命令,并设法将错误范围缩小到一行。该行将一个名为$sql
的变量设置为准备好的SELECT
语句,由于某种原因,这将停止代码,因为之后放置的任何echo
命令都将无法运行。关于发生了什么以及如何解决它的任何想法?或者你们认为跟随更多login system会更好吗?这似乎包括也有助于安全的令牌。
// Confirm login
echo "1";
include("config.php");
$username = $_POST['username'];
$password = $_POST['pass'];
if(isset($_POST) && $username != '' && $password != ''){
echo "2".$username;
$sql = $dbh->prepare("SELECT id,password,psalt FROM users WHERE username=?");
echo "3";
$sql->execute(array($username));
if($sql->rowCount() > 0) {
while($result = $sql -> fetch()){
$pass = $result['password'];
$p_salt = $result['psalt'];
$id = $result['id'];
}
echo "3";
$site_salt="salthashhere";
$salted_hash = hash('sha256',$password.$site_salt.$p_salt);
if($pass == $salted_hash){
echo "5";
$_SESSION['user'] = $id;
header("Location:home.php");
} else {
echo "<h2>Username/Password is Incorrect.</h2>";
echo "<a href='register.php'>Register Here</a>";
}
}
答案 0 :(得分:0)
您需要注意的一件事rowCount()
无法保证在SELECT
语句中使用时提供准确的结果,通常用于返回受上一个 DELETE <影响的行数/ strong>, INSERT 或 UPDATE 语句由相应的PDOStatement对象执行。
在您的情况下选择后,您可能需要将所有结果作为数组获取,然后使用count()方法计算返回的元素数。
请尝试以下代码:
<?php
// Confirm login
echo "1";
include("config.php");
$username = $_POST['username'];
$password = $_POST['pass'];
if (isset($_POST) && $username != '' && $password != '') {
echo "2" . $username;
$sql = $dbh->prepare("SELECT id,password,psalt FROM users WHERE username=?");
echo "3";
$sql->execute(array($username));
$result = $sql->fetchall(); //fetch all results as array
if (count($result) > 0) {
foreach ($result as $key => $row) {
$pass = $row['password'];
$p_salt = $row['psalt'];
$id = $row['id'];
echo "3";
$site_salt = "salthashhere";
$salted_hash = hash('sha256', $password . $site_salt . $p_salt);
if ($pass == $salted_hash) {
echo "5";
$_SESSION['user'] = $id;
header("Location:home.php");
} else {
echo "<h2>Username/Password is Incorrect.</h2>";
echo "<a href='register.php'>Register Here</a>";
}
}//end foreach
} else {
// account does not exist
echo "<h2>account does not exist.</h2>";
echo "<a href='register.php'>Register Here</a>";
}
}
?>
PS:你可能想看看并利用php内置的优势 密码_hash()和密码_verify()它们更安全。