我正在做的一个网页,用户将介绍他们的信用卡,他们也可以获得虚拟货币。
但我在考虑下一种登录类型是否安全。对于SQL INJECTION的一切。和黑客。
登录进程哪个更好?: 第一: - SELECT * FROM users WHERE pass ='$ pass' - 并且选择的用户将其与用户或用户名中的邮件进行比较。
第二个: - SELECT * FROM users WHERE user ='$ user' - 选择通过将其与来自用户的通行证进行比较
第三个: - 哈希md5用户和密码,并直接在数据库中进行比较。但我需要保存加密和正常的用户名谢谢:)
答案 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已经破解了......不确定。