2010-07-26 2 views
4

방금 ​​PHP와 MySQL을 시작했으며 이것이 "안전한"것인지 알아야합니다. 로그인 정보는 AJAX (jQuery)를 통해 다음 PHP 파일로 전달됩니다.PHP AJAX 로그인,이 방법은 안전한가요?

jQuery를 AJAX

$("#login_form").submit(function(){ 
    $.post("login.php",{user:$('#username').val(),pass:$('#password').val()} ,function(data) 

PHP

ob_start(); 
mysql_connect("-", "-", "-") or die("ERROR. Could not connect to Database."); 
mysql_select_db("-")or die("ERROR. Could not select Database."); 

//Get Username and Password, md5 the password then protect from injection. 

$pass = md5($pass); 
$user = stripslashes($user); 
$pass = stripslashes($pass); 
$user = mysql_real_escape_string($user); 
$pass = mysql_real_escape_string($pass); 

//See if the Username exists. 
$user_result=mysql_query("SELECT * FROM users WHERE username='$user'"); 
$user_count=mysql_num_rows($user_result); 

if($user_count==1){ 
    if($pass_length==0){ echo "userVALID"; } 
    else{  
     $pass_result=mysql_query("SELECT * FROM users WHERE username='$user' and password='$pass'"); 
     $pass_count=mysql_num_rows($pass_result);  
     if($pass_count==1){    
      session_register("user"); 
      session_register("pass"); 
      echo "passVALID"; 
     } 
     else { echo "passERROR"; }  
    } 
} 
else { echo "userERROR"; } 

ob_end_flush(); 

내가이 일을하지만 가장 좋은 방법이 될 수 없습니다 알고는, 내가 알고있는 방법입니다! 나는 그것이 중요한 보안 결함이 있는지를 알고 싶다. 그것은 나를위한 개념이며, 따라서 SSL을 통합하지 않습니다.

+2

stripslashes ($ user); ? MAGIC_QUOTE가 활성화되어 있고 REGISTER_GLOBAL도 활성화되어 있다고 의심됩니다. 이 두 기능은 더 이상 사용되지 않으며 사용하지 않는 것이 좋습니다. http://ca.php.net/manual/ko/security.magicquotes.php http://php.net/manual/en/security.globals.php – HoLyVieR

답변

5

당신이 경우 사람들이 암호에 백 슬래시가 그냥이 변경을해야합니다. 또한 md5()mysql_real_escape_string()은 중복됩니다. 야생에서 충돌이 발생했습니다. sha1() 약화되었지만 여전히 안전하고 충돌이 발생하지 않았습니다 (아직). 가장 좋은 선택은 sha256 in php이거나 mhash 라이브러리를 사용하는 것입니다.

$pass = md5($pass); 

당신은 또한 당신이 _SESSION [] $를 사용해야되지 않습니다() salt the password.

+0

정보 주셔서 감사합니다; 나는 내가 SHA로 그것을 바꿀 필요가 있다는 것을 압니다. 그러나 첫 시도에서 이것은 효과가 없었습니다. 정보에 대해 다시 한번 감사드립니다. – Phil

+0

이제 나는 어리 석다. 내 데이터베이스의 VARCHAR는 50으로 제한되었으므로 SHA1은이 중 일부를 잘라 냈습니다 ... 이제 정렬되었습니다. 감사합니다. – Phil

+0

@Phil 걱정하지 마십시오. "텍스트"데이터 형식이 마음에 들지만 해시는 항상 동일한 크기이므로 varchar가 아마도 더 좋습니다. – rook

5

그것은 적어도 사용자 이름과 암호를 보내 (암호화되지 않은 연결을 통해 사용 HTTPS를 암호 전송

  • 을 앓고;.이 수동적 인 공격자에 대한 아니라 활성 것들에 대한 암호를 보호하는 활동에 대하여 안전하기 공격자는 모든 통신을 암호화해야합니다.
  • 암호를 데이터베이스에 저장합니다 (대신 소금에 절인 해시를 저장해야합니다).
+0

이것은 내 학교 휴일이므로 레크리에이션 프로젝트에 가깝습니다. ! 그것은 단지 프로젝트이므로 실제로 SSL 인증서를 사용하지 않는 한 SSL 인증서를 지불하지 않습니다. 소금에 절인 해시 제안에 감사드립니다! – Phil

+0

@Phil 엄격히 말하면 보안 인증을 수행하는 데 SSL이 필요하지 않은 경우 [digest authentication] 변형을 사용할 수 있습니다 (http://en.wikipedia.org/wiki/Digest_authentication). 그러나이 경우 소금에 절인 해시를 저장할 수는 없다고 생각합니다. 데이터베이스 데이터가 노출되면 공격자는 모든 사용자로 로그인 할 수 있습니다. – Artefacto

+0

@Atrefacto ... 실제로'$ pass = md5 ($ pass);'(Line 7). 나는 그가 MD5 해시를 저장하고 있다고 믿는다 - 매우 안전하지는 않지만 * 평문이 아니다. –

4

"사용자가 존재하지 않음"또는 "잘못된 비밀번호"와 같은 사용자에게 절대로 말하지 마십시오. "잘못된 사용자 이름 또는 암호"를 인쇄하면 모든 사용자가 기존의 사용자 이름을 확인한 다음 암호를 추측 할 수 없으므로 훨씬 더 좋습니다.

if(get_magic_quotes_gpc()){ 
    $user = stripslashes($user); 
    $pass = stripslashes($pass); 
} 
$user = mysql_real_escape_string($user); 
$pass = sha256($salt.$pass); 

가장 먼저 MD5 아주 나쁜 :

+0

이 문제를 알고 있지만 이것이 PHP와 mySQL에 대해 배우기 위해 사용하고있는 프로젝트 였기 때문에 좀 더 많은 기능을 통합하는 것이 더 재미있을 것이라고 생각했습니다. jQuery는 실제로 PHP 파일에서 반환 된 데이터를 가져 와서이를 기반으로 CSS를 변경합니다. 따라서 사용자 이름 입력이 흐려지면 배경이 녹색으로 바뀝니다. 분명한 이유가 있지만 암호에 적용하지 않았습니다! 감사! – Phil

+0

나는 개인적으로 그 옵션을 싫어한다. 그런 다음 사용자 이름이나 암호를 잘못 입력했는지 여부를 알 수 없습니다. 이 문제에 관심이있는 경우 각 사용자 이름의 시도 속도를 제한하십시오. – Artefacto

+0

사용자 이름이 틀리면 빨간색으로 바뀝니다. 그것이 당신이 아는 방법입니다. – Phil

1

가 session_register해야합니다.

또한 해시 된 암호 문자열 $ pass에서 문자열 이스케이프를 수행합니다. 항상 16 진수 값을 가지므로 이스케이프 할 필요가 없습니다. 해시 전에 암호 문자열에서 이스케이프를 수행 할 수 있지만 약간 유용합니다 (예 : 이스케이프해야하는 문자가 포함 된 사용자가 암호를 저장할 수 있도록 허용 한 경우 일반적으로 코드의 등록 측에서 허용하지 않습니다) . 소금도 사용해야합니다. 내 연구에

1

자료 :

  1. 로그인 JQuery와 아약스를 사용하여 일반 오래된 형태로 안전합니다. 데이터는 항상 http 요청을 통해 전송됩니다.
    참조 : ajax safe for login?
  2. 로그인 양식에 SSL (https)을 사용하면 보안이 강화됩니다.why prepared statement?prepared statement usage example
  3. 당신이 그런 Bcrypt 같은 단방향 암호 해시 알고리즘을 사용한다 :
  4. 대신로 mysql_connect를 사용하여, 당신은 준비된 문을
    참조를 사용해야합니다. 단방향 해시 알고리즘은 해시 된 암호를 다시 일반 텍스트로 변환 할 수 없음을 의미합니다. 그러나 데이터베이스에 저장된 해시 된 암호와 키 입력 암호를 ​​비교할 수 있습니다.
    참조 : don't encrypt password, hash it instead.the Bcrypt and how to use it
관련 문제