2012-02-24 2 views
0

이 로그인 시스템은 안전한가요?이 로그인 시스템은 안전합니까?

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

보기 'bcrypt' http://stackoverflow.com/questions/6863410/php-bcrypt-hashing – scibuff

+0

글쎄, 여기에 게시 한 이후가 아닙니다. – Zyerah

+0

'$ user' 변수는 쿼리에서 사용되기 전에 이스케이프되어야합니다. 또는 전체 데이터베이스를 SQL 인계로 쉽게 삭제할 수 있습니다. –

답변

3

아니요 안전하지 않습니다. 당신은 SQL 주입 공격에 당신 자신을 개방하고 있습니다.

SELECT * FROM $auth_mysql_table WHERE user='a'; drop table user; select '1'='1' 
: 누군가가 사용자 입력 필드에이를 입력 한 경우

a'; drop table user; select '1'='1 

이이 같은 SQL 문을 초래합니다 ($ _POST [$ 사용자]로 전환하는), 무슨 일이 일어날 지 상상 데이터베이스에 대해 실행할

. 그 나쁜!

입력을 위생적으로 처리해야합니다. 이 글을 읽을 : http://php.net/manual/en/security.database.sql-injection.php

편집 : relevant

+0

나는 그것이 안전하지 않다고 동의하지만, mysqli는 당신이보고 한 문장을 실행할 것이고, mysql은 그렇지 않을 것이다. mysql을 삽입하려면 MySQL 오류를 발생시키고 이스케이프 문자를 사용하여 출력을 화면에 출력해야한다. – Fabrizio

+0

고마워, 내가 왜 여기 온거야! – mindandmedia

+0

와우, 나는 그것이 얼마나 안전하지 않은지 알지 못했다. 좋은 예를 들어 주셔서 감사합니다 – luke

-1

mysql_close은 좋은 연습입니다. PHP는 스크립트가 끝날 때 자동으로 연결을 닫습니다. http://php.net/manual/en/ref.mcrypt.php

당신은 또한에이 명심 :

MD5, 당신은 PHP 암호화에 대한 자세한 내용은이 링크를 참조

AES

같은 일부 다른 PHP 암호화 라이브러리를 사용할 수있는 최선의 암호화 방법이 아닙니다 항상 위생 처리 코드!

MySQL 삽입은 나쁜 짐승이 될 수 있습니다 !!

+0

md5 및 aes는 상호 교환 할 수 없으며 md5는 해시 알고리즘이고 aes/Rijndael은 암호입니다. – VolkerK

+0

정확하지만 둘의 결합은보다 안전 할 수 있습니다. – Fabrizio

5

이 해시에 소금을 추가합니다. 이것은 무작위 문자열, 사용자 이름, 계정 생성 타임 스탬프 또는 원하는 사용자가 될 수 있습니다. 주어진 사용자가 로그인 할 때마다 동일하면됩니다. 목적은 우선 무지개 표를 깨뜨리는 것입니다. 두 번째는 일반적으로 짧은 암호에 엔트로피를 추가하는 것입니다.

$pass = $_POST['pass']; 
$salt = "7y9fhu8a" 
$secure_pass = md5($pass . $salt); 

두 번째로, 사용자 이름 입력을 위생적으로 처리하지 않습니다. SQL 인젝션 공격을 막기 위해 사용자 이름에 mysql_real_escape_string을 추가 할 수 있습니다.

$query = "SELECT * ". 
     "FROM $auth_mysql_table ". 
     "WHERE user='" . mysql_real_escape_string($user) . "'"; 
$result = mysql_query($query); 

사용자 입력을 삭제하는 다른 방법이 있지만 빠르고 빠릅니다. mysql_close가가는 한, 나는 신경 쓰지 않을 것이다. 다른 쿼리를 실행해야하는 경우 연결을 다시 열어야합니다.

0

아니요 안전하지 않습니다.

사용자 입력을 위생적으로 처리하거나 (더 나은) 바인드 변수를 사용해야합니다. PHP를 들어 당신은 PDO를 사용할 수 있습니다 PHP PDO prepared statements

또한, 무염의 MD5 해시 암호에 대한 끔찍한 선택이고 실제 보안을 제공하지 않습니다. 소금에 절인 md5는 단지 약간 더 좋을뿐입니다 (그러나 여전히 끔찍한 범주에 있습니다).

당신은해야 하나 :

  1. 자신이 다음 훨씬 강한 해시 함수 등을 사용하여 암호를 처리하기 위하여려고하는 경우에 어떤 passwords- 사용 연합 로그인 (오픈 ID, OAuth를, 등)
  2. 를 저장하지 않음 scrypt, bcrypt 또는 PBKDF2입니다.
관련 문제