首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个登录系统安全吗?

这个登录系统安全吗?
EN

Stack Overflow用户
提问于 2012-02-25 07:41:18
回答 4查看 267关注 0票数 0

这个登录系统安全吗?

代码语言:javascript
复制
    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可以是too.Also,需要mysql_close()吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-25 07:45:23

不,它不安全。您正在向sql注入攻击敞开大门。想象一下,如果有人在您的用户输入字段(进入$_POST$user)中输入以下内容,会发生什么情况

代码语言:javascript
复制
a'; drop table user; select '1'='1

这将产生如下的sql语句:

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2012-02-25 08:01:05

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

代码语言:javascript
复制
$pass = $_POST['pass'];
$salt = "7y9fhu8a"
$secure_pass = md5( $pass . $salt );

其次,你没有清理你的用户名输入。您可以将mysql_real_escape_string添加到您的用户名以防止sql注入攻击。

代码语言:javascript
复制
$query = "SELECT * ".
         "FROM $auth_mysql_table ".
         "WHERE user='" . mysql_real_escape_string($user) . "'";
$result = mysql_query($query);

还有其他方法可以清理用户输入,但这是快速和肮脏的。至于mysql_close,我不会费心去做的。如果您需要运行任何其他查询,则需要重新打开连接。

票数 5
EN

Stack Overflow用户

发布于 2013-04-24 17:01:11

不不安全。

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

此外,无盐md5是用于散列密码的糟糕的选择,并且没有提供真正的安全性。加盐的md5只是稍微好一点(但仍然属于糟糕的类别)。

您应该:

  1. 不存储任何密码-使用联合登录(OpenID、OAuth等)
  2. 如果您要自己处理密码,则使用更强大的哈希函数,如scryptbcrypt或use
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9439636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档