2011-12-12 125 views
1

我在做一个网页,用户将介绍他们的信用卡,也可以得到虚拟货币。安全登录php

但我想如果下一种登录类型是安全的。对于一切SQL注入。和黑客。

  • 它将与SSL
  • Paswoord MD5进行加密。
  • 邮件将被JS验证

登录理线的哪个更好?: 第一招: - SELECT * FROM WHERE通=“$通” 用户 - 与用户选择的我与它相比较用户或来自用户名的邮件。

第二个: - SELECT * FROM WHERE USER = '$用户' 用户 - 通过选择与用户

Thrird一个传球比较一下: - 哈希MD5用户和密码,并直接进行比较在DB中。但我需要将加密的用户名和正常

谢谢:)

+0

SSL适合反包嗅探,但有cain可以伪造/伪造,md5从来没有用于加密密码,用js验证是无用的,您应该始终验证服务器端,不需要消化/安全用户名 –

+0

你能澄清你的意思是“邮件将通过js验证”吗? – deceze

+0

这是一个真正的邮件地址,其中[email protected] – Edig

回答

1

“Thrird之一: - MD5哈希用户和密码,直接在数据库中进行比较,但我需要保存加密和正常的用户名”

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

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

+0

是的md5被破解,这就是为什么我会使用sha1。关于你的回答你说我可以解密用户名。但我想要1路加密。此外,这可以消除sql注入 – Edig

+0

我建议对会话中存储的用户名使用双向加密。数据库使用单向加密,例如MD5。除了将用户名作为纯文本存储在会话中之外,我没有看到其他任何方式。这就是为什么我认为用户名的双向加密只是会话的更好选择。 –

+0

好主意。这将消除SQL注入。因为电子邮件不是秘密的 – Edig

1

我会选择第二个选项去尽可能多的用户可以有相同的密码,使第一个选项效率较低。

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

+0

OH我不知道md5坏了。然后我会检查sha1。感谢 – Edig

+0

http://en.wikipedia.org/wiki/Rainbow_table – andrewtweber

+0

也许创建一个新的加密其可能? – Edig

1

为了正确地哈希密码,您需要对它们进行盐化并使用合适的哈希算法。避免在这里重新发明轮子,并使用现有的,经过验证的实施,如phpass。作者还提供了一些关于密码散列和如何使用该库的优秀文章。

+0

但如果它的公开。有人可以学习它并知道如何破解它。我真的需要非常安全的网页。几乎就像一家银行 – Edig

+2

@ Ernesto通过默默无闻的安全性是没有安全感的!系统是安全的,因为它在逻辑上是合理的,不是因为算法是未知的。在任何好的安全系统中,*实现*并不重要。认为你可以自己创建一个加密音响系统,而不需要同行评审是一个很大的错误。 – deceze

+0

我从来没有这样想过。我将检查您发送给我的网页。谢谢。对不起,你是用盐来做什么的? – Edig

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