这个登录系统是否安全?

luk*_*uke 0 php mysql security sql-injection login

这个登录系统安全吗?

    if ($_POST[$submit]){

$user = $_POST[$user];
$pass = $_POST[$pass];

if ($user && $pass){ //if user and pass is enterered

        require("vars.php"); //require MySQL conection settings
        mysql_connect($auth_mysql_server, $auth_mysql_user, $auth_mysql_pass); //connect to MySQL
        mysql_select_db($auth_mysql_db); // select MySQL database

        $pass = md5($pass); // hash password

        $query = mysql_query("SELECT * FROM $auth_mysql_table WHERE user='$user'"); // run query
        $numrows = mysql_num_rows($query);

        if ($numrows == 1){ //check if user exists
            $row = mysql_fetch_assoc ($query);
            $dbid = $row[$auth_mysql_id_row];
                $dbuser = $row[$auth_mysql_user_row];
                $dbpass = $row[$auth_mysql_pass_row];

                if ($pass == $dbpass){ // if password is equal to the one in the database start session
                    session_start();
                    //set session information
                    $_SESSION['user'] = $dbuser;

                    header("Location:$auth_loggedin"); // goto logged in page

                }
                else return (3);
        }
        else return (2);

        mysql_close(); // close MySql connection
    }
    else return (1);}
Run Code Online (Sandbox Code Playgroud)

如果不是,我怎么能让它安全?

我哈希密码但我知道md5可以解密但是sha1也可以.还mysql_close()需要吗?

小智 5

加盐到你的哈希.这可以是随机字符串,用户名,帐户创建时间戳或几乎任何你喜欢的,只要每次给定用户登录时它都是相同的.目的是首先打破彩虹表(常见的长列表)已经md5加密的密码),其次,将熵添加到通常的短密码.

$pass = $_POST['pass'];
$salt = "7y9fhu8a"
$secure_pass = md5( $pass . $salt );
Run Code Online (Sandbox Code Playgroud)

其次,您没有清理用户名输入.您可以在用户名中添加mysql_real_escape_string以防止sql注入攻击.

$query = "SELECT * ".
         "FROM $auth_mysql_table ".
         "WHERE user='" . mysql_real_escape_string($user) . "'";
$result = mysql_query($query);
Run Code Online (Sandbox Code Playgroud)

还有其他方法来消毒用户输入,但这是快速和肮脏的.至于mysql_close,我不会打扰.如果您需要运行任何其他查询,则需要重新打开连接.