PHP登录保持返回无效用户

时间:2013-12-16 22:13:39

标签: php mysql

我很确定我的编码正确,但我不完全确定。这是一个简单的登录表单,每当我尝试登录时,我都会收到“无效用户”。

我正在检查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");
}
?>

1 个答案:

答案 0 :(得分:4)

您的实施存在以下几个问题:

  1. 您仍在使用mysql_个功能;这些内容已被弃用,支持PDOmysqli

  2. 由于#1,您也没有使用预备语句。

  3. 由于#2以及您未在SQL中正确转义变量这一事实,您的代码容易受到SQL注入攻击。

  4. 您以纯文本格式存储密码。你应该使用password hashing;如果您不使用5.5,则可以使用password_compat代替。

  5. 不推荐使用session_register();你应该使用超全球$_SESSION代替。

  6. 这是一个你可以用来完成同样事情的例子:

    $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");
    }
    
相关问题