2011-12-12 2 views
1

나는 사용자가 신용 카드를 소개하고 가상 돈을 벌 수있는 웹 페이지를 만들고 있습니다.안전한 로그인 PHP

하지만 다음 로그인 유형이 안전 할 지 생각 중이 었습니다. 모든 것을 위해 SQL INJECTION. 그리고 해킹.

  • 는 그것은 SSL
  • Paswoord MD5로 암호화됩니다.
  • 메일 JS와

로그인 사전 처리를 검증 될 자사의 더 나은? 먼저 하나 - 내가 그것을 비교하고 사용자 선택 - 패스 = '$ 패스' 사용자 SELECT * FROM 사용자 또는 사용자 이름의 메일

두 번째 : - 사용자

Thrird 하나의 통과와 비교 선택 패스 - 사용자 = '$ 사용자' 사용자 SELECT * FROM : - 해시 MD5 사용자 및 암호와 직접 비교 DB에. 하지만 많은 사용자가 동일한 암호 첫 번째 옵션은 덜 효율적이 수 내가 두 번째 옵션과 함께 갈 것 암호화 된 사용자 이름과 정상

감사합니다 :)

+0

SSL은 안티 패킷 스니핑에 적합하지만 cain은 스푸핑되거나 위조 될 수 있으며 md5는 암호를 암호화하지 않으며 js로 유효성 검사는 쓸모가 없으며 항상 서버 측의 유효성을 검사해야하며 소화/보안 할 필요가 없습니다 사용자 이름 –

+0

"메일이 js로 유효성이 검사됩니다"라는 의미를 명확히 할 수 있습니까? – deceze

+0

[email protected] – Edig

답변

1

"Thrird 하나 -. 해시 MD5 사용자 및 암호와 DB에서 직접 비교하지만 모두 암호화되어 일반 사용자 이름을 저장해야"

이 사람은 좋아 보인다. 반드시 두 형식 모두에서 사용자 이름을 저장할 필요는 없습니다. DB에서 MD5 암호화를 사용하는 것이 하나의 방법입니다. 응용 프로그램 (PHP)에서 일부 2 방향 암호화를 사용하여 사용자 이름을 암호화하고 세션에 저장합니다. 사용자 정보를 얻으려면 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; 
} 
?>