我很确定我的编码正确,但我不完全确定。这是一个简单的登录表单,每当我尝试登录时,我都会收到“无效用户”。
我正在检查MySQL数据库,条目就在那里。这是我在log.php中的代码:
<?php
session_name("MyLogin");
session_start();
if($_GET['action'] == "login") {
$conn = mysql_connect("host","username","password"); // your MySQL connection data
$db = mysql_select_db("database"); //put your database name in here
$name = $_POST['user'];
$q_user = mysql_query("SELECT * FROM USERS WHERE login='$name'");
if(mysql_num_rows($q_user) == 1) {
$query = mysql_query(" SELECT * FROM USERS WHERE login='$name'");
$data = mysql_fetch_array($query);
if($_POST['pwd'] == $data['password']) {
session_register("name");
header("Location: index.html"); // success page. put the URL you want
exit;
} else {
header("Location: login.php?login=failed&cause=".urlencode('Wrong Password'));
exit;
}
} else {
header("Location: login.php?login=failed&cause=".urlencode('Invalid User'));
exit;
}
}
// if the session is not registered
if(session_is_registered("name") == false) {
header("Location: login.php");
}
?>
答案 0 :(得分:4)
您的实施存在以下几个问题:
由于#1,您也没有使用预备语句。
由于#2以及您未在SQL中正确转义变量这一事实,您的代码容易受到SQL注入攻击。
您以纯文本格式存储密码。你应该使用password hashing;如果您不使用5.5,则可以使用password_compat代替。
不推荐使用session_register()
;你应该使用超全球$_SESSION
代替。
这是一个你可以用来完成同样事情的例子:
$action = filter_input(INPUT_GET, 'action', FILTER_UNSAFE_RAW);
if ($action == 'login') {
$user = filter_input(INPUT_POST, 'user', FILTER_UNSAFE_RAW);
$password = filter_input(INPUT_POST, 'password', FILTER_UNSAFE_RAW);
$dbh = new PDO('mysql:host=host;dbname=database;charset=utf8', 'username', 'password', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$stmt = $dbh->prepare('SELECT * FROM `users` WHERE `login` = ?');
$stmt->execute([$user]);
if (($row = $stmt->fetch(PDO::FETCH_ASSOC)) !== false && password_verify($password, $row['password'])) {
$_SESSION['user'] = $row;
header("Location: index.html"); // success page. put the URL you want
} else {
header("Location: login.php?login=failed&cause=".urlencode('Invalid User or password'));
}
exit;
}
if (!isset($_SESSION['user'])) {
header("Location: login.php");
}