安全登录php

时间:2011-12-12 02:42:43

标签: php

我正在做的一个网页,用户将介绍他们的信用卡,他们也可以获得虚拟货币。

但我在考虑下一种登录类型是否安全。对于SQL INJECTION的一切。和黑客。

  • 将使用SSL加密
  • Paswoord md5。
  • 邮件将使用js验证

登录进程哪个更好?: 第一: - SELECT * FROM users WHERE pass ='$ pass' - 并且选择的用户将其与用户或用户名中的邮件进行比较。

第二个: - SELECT * FROM users WHERE user ='$ user' - 选择通过将其与来自用户的通行证进行比较

第三个: - 哈希md5用户和密码,并直接在数据库中进行比较。但我需要保存加密和正常的用户名

谢谢:)

4 个答案:

答案 0 :(得分:1)

我会使用第二个选项,因为许多用户可以使用相同的密码,使第一个选项的效率降低。

你应该知道md5现在已经坏了。我会使用sha1加密并加密密码。我认为没有任何理由加密用户名,但我可能是错的。

答案 1 :(得分:1)

对于正确的散列密码,您需要对它们进行加密并使用适当的散列算法。避免在这里重新发明轮子,并使用现有的,经过验证的实施,如phpass。作者还有一些关于密码散列以及如何使用该库的精彩文章。

答案 2 :(得分:1)

这是我构建的精简安全登录功能,我已经在我的许多项目中使用过了。 它表明它不仅仅是检查用户名和密码,还可以更新哈希,并与您的用户名一起检查。

仔细看看,你的想法得到了解。

<?php 
session_start();

//Checks on all pages, this checks time validity & hased user ip set at login, it will log out if something changes
$_SESSION['user_status'] = auth($_SESSION['user_name'],$_SESSION['user_hash'],"","","check");
//or
if(@auth($_SESSION['user_name'],$_SESSION['user_hash'],"","","check")=="LOGGED_IN" && $_SESSION['user_status']=='LOGGED_IN'){
    //Logged _in
}

//LOGIN
if(isset($_POST['user']) && isset($_POST['pass'])){
    $_SESSION['user_status'] = auth("","",$_POST['user'],$_POST['pass'],"login");
}

//LOGOUT USER
if(isset($_REQUEST['do']) && $_REQUEST['do'] =='logout'){
    auth("","","","","logout");
    header('Location: ./index.php');
}

/**
         * Auth function for logging in & persistaint user checks
         *
         * @param $_SESSION string $logged_in_user
         * @param $_SESSION string $hash
         * @param $_POST string $username
         * @param $_POST string $password
         * @param string $exe
         * @return set $_SESSION string
         */
function auth($logged_in_user,$hash,$username="",$password="",$exe) {
    global $db;
    if ($exe=='login') {
        //LOGIN
        $result = mysql_query('SELECT * FROM users WHERE username="'.mysql_real_escape_string($username).'" and password="'.mysql_real_escape_string(sha1($password)).'"',$db);
        $num = mysql_num_rows($result);
        if($num=='1') {
            session_regenerate_id();
            $_SESSION['logged_in']=true;
            while ($row = mysql_fetch_array($result)) {
                $_SESSION['user_id'] = $row['id'];
                $_SESSION['user_name'] = $row['username'];
                $_SESSION['user_hash'] = sha1($row['username'].$_SERVER['REMOTE_ADDR']);
                $_SESSION['user_ip'] = $_SERVER['REMOTE_ADDR'];
                $_SESSION['user_date'] = time();
                $_SESSION['user_level'] = $row['user_level']; // have different user levels for your users
            }
            mysql_query('REPLACE INTO users values ("'.mysql_real_escape_string($_SESSION['user_id']).'","'.mysql_real_escape_string($_SESSION['user_name']).'","'.mysql_real_escape_string(sha1($password)).'","'.mysql_real_escape_string($_SESSION['user_hash']).'","'.mysql_real_escape_string($_SESSION['user_ip']).'","'.mysql_real_escape_string($_SESSION['user_date']).'","'.mysql_real_escape_string($_SESSION['user_comment']).'","'.mysql_real_escape_string($_SESSION['user_level']).'")',$db);
            $return = 'LOGGED_IN';
            return $return;
        }elseif($num >='2') {
            $_SESSION['logged_in']=false;
            $error = 'ERROR:MULTI:USERS';
            return $error;
        }else{
            unset($_SESSION['user_id']);
            unset($_SESSION['user_name']);
            unset($_SESSION['user_hash']);
            unset($_SESSION['user_ip']);
            unset($_SESSION['user_date']);
            unset($_SESSION['user_level']);
            $_SESSION['logged_in']=false;
            session_destroy();
            $return = 'ACCESS_DENIDE';
            return $return;
        }
        return $return;
    }
    if($exe=='check') {
        //CHECK
        $result = mysql_query('SELECT hash,ip,user_date FROM users WHERE username="'.mysql_real_escape_string($logged_in_user).'" and hash="'.mysql_real_escape_string($hash).'"',$db);
        if(mysql_num_rows($result)==1) {
            $rows = mysql_fetch_row($result);
            $timeout = (time()-1800);
            if($rows[2]<=$timeout){auth("","","","","logout");
            return'ACCESS_TIMEOUT';
            }
            if($hash==$rows[0] && $_SERVER['REMOTE_ADDR']==$rows[1]) {
                $return = 'LOGGED_IN';
                mysql_query('UPDATE users set user_date="'.time().'"',$db);
                return $return;
            }else {
                session_regenerate_id();
                $_SESSION['logged_in'] = 'ACCESS_DENIDE';
                $return = 'ACCESS_DENIDE';
                return $return;
            }
        }else{
            session_regenerate_id();
            $_SESSION['logged_in']=false;
            $return = 'ACCESS_DENIDE';
            return $return;
        }
    }
    if($exe=='logout') {
        //LOGOUT
        unset($_SESSION['user_id']);
        unset($_SESSION['user_name']);
        unset($_SESSION['user_hash']);
        unset($_SESSION['user_ip']);
        unset($_SESSION['user_date']);
        unset($_SESSION['user_level']);
        unset($_SESSION['logged_in']);
        session_destroy();
        session_regenerate_id();
        $return = 'ACCESS_LOGGED_OUT';
        return $return;
    }
    return false;
}
?>

答案 3 :(得分:1)

“第三个: - 哈希md5用户和密码,并直接在数据库中进行比较。但我需要保存加密和正常的用户名”

这个似乎没问题。您不一定需要以两种格式保存用户名。在DB中使用MD5加密这是一种方式。在应用程序(PHP)中,使用某种双向加密对用户名进行加密,并将其保存在会话中。当您需要获取用户信息时,只需在php中解密加密的用户名,将查询发送到数据库再次使用md5加密纯文本用户名。

N.B。我不知道你的网站有多安全,但我相信MD5已经破解了......不确定。