这个登录系统是否安全?

时间:2012-02-24 23:41:18

标签: php mysql security login sql-injection

此登录系统是否安全?

    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);}

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

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

4 个答案:

答案 0 :(得分:5)

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

$pass = $_POST['pass'];
$salt = "7y9fhu8a"
$secure_pass = md5( $pass . $salt );

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

$query = "SELECT * ".
         "FROM $auth_mysql_table ".
         "WHERE user='" . mysql_real_escape_string($user) . "'";
$result = mysql_query($query);

还有其他方法可以清理用户输入,但这很快就会变脏。至于mysql_close,我不会打扰。如果您需要运行任何其他查询,则需要重新打开连接。

答案 1 :(得分:3)

不,它不安全。你正在打开sql注入攻击。想象一下如果有人将其输入你的用户输入字段(进入$ _POST [$ user])会发生什么

a'; drop table user; select '1'='1

这会导致像这样的SQL语句:

SELECT * FROM $auth_mysql_table WHERE user='a'; drop table user; select '1'='1'

您将针对您的数据库执行。那太糟糕了!

你需要清理你的输入。请阅读:http://php.net/manual/en/security.database.sql-injection.php

编辑:relevant

答案 2 :(得分:0)

不,这不安全。

您需要清理用户输入或(甚至更好)使用绑定变量。对于PHP,您可以使用PDO:PHP PDO prepared statements

此外,对于散列密码,未加保护的md5是可怕的选择,并且不提供真正的安全性。盐渍的md5只略微好一点(但仍处于可怕的类别)。

你应该:

  1. 不存储任何密码 - 使用联合登录(OpenID,OAuth等)
  2. 如果您要自己处理密码,请使用更强的哈希函数,例如scryptbcryptPBKDF2

答案 3 :(得分:-1)

mysql_close不是必需的,但这是一种很好的做法。 PHP将自动关闭脚本末尾的连接。

MD5不是最好的加密方法,你可以使用其他一些PHP加密库,如AES

有关PHP加密的更多信息,请参阅此链接: http://php.net/manual/en/ref.mcrypt.php

请记住,您还必须 始终清理 代码!!

MySQL注入可能是一个糟糕的野兽!!