2011-12-12 302 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; 
} 
?>