此登录系统是否安全?
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()
吗?
答案 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只略微好一点(但仍处于可怕的类别)。
你应该:
答案 3 :(得分:-1)
mysql_close
不是必需的,但这是一种很好的做法。 PHP将自动关闭脚本末尾的连接。
MD5不是最好的加密方法,你可以使用其他一些PHP加密库,如AES
有关PHP加密的更多信息,请参阅此链接: http://php.net/manual/en/ref.mcrypt.php
请记住,您还必须 始终清理 代码!!
MySQL注入可能是一个糟糕的野兽!!