2011-05-12 6 views
2

저는 처음부터 디자인 한 사이트에서 PHP와 MySQL을 사용하고 있습니다.사용자가 사이트에 로그인 할 때 사용자 이름과 비밀번호 또는 사용자 이름 만 선택하면됩니까?

사이트에 로그인하면, 내가해야 할 때 :

  • 내가 사용자 이름과 암호 필드 색인을 필요로하는 경우에 쿼리 WHERE username='username' AND password='password'을 확인하고 한 경우 "잘못된 로그인"을 반환 할 수 있습니다 세부 사항을 잘못

또는

  • 나는 인덱스 단지 사용자 이름 필드에 필요한 경우에 쿼리 WHERE username='username' 만,로 해, 서버 측 코드에서 암호가 일치하는지 확인해야합니다.

?


UPDATE :
이 질문은 좋은 습관에 관한 것입니다. 그것은 두 세부 사항이 맞을 때만 DB에서 응답을 얻을 수 있도록 암호 필드에 색인을 추가하는 전문가가 있는지 여부에 관한 것입니다.이 색인이 차지할 공간과 크기의 단점보다 중요합니다.
내 시스템의 특정 사항 (프로그래밍 언어 및 DB 유형 제외)이 적절하다고 생각하지 않아 도움이 될 것입니다.

+0

하는 언어와 데이터베이스? –

+0

언어 : php, db : mysql – Doron

답변

0

내가 후자를 할 것입니다 (사용자 이름은 "찾고있는 것"입니다. 특정 단계에서 명시적인 비밀번호 확인을 수행합니다.)하지만 특정 코드베이스에 대한 심층적 인 지식 없이는 맞춤 응답을 내놓을 수 없습니다. 편집

당신은 색인을 언급; 모두 사용자 이름과 암호 필드는 username이 고유하지 않은 경우에만 의미가 있습니다. 그래서 다소 논란의 여지가 있습니다.

0

당신이 username = 'username'을 SQL 문에 처음 사용한다면 암호 필드에 성능상의 불이익을주지 않을 것입니다.

확실하지는 않지만 프로그래밍 언어에서 첫 번째 명령문이 false를 반환하면 AND 체인의 다른 명령문을 평가하지 않습니다.

if(iAlwaysReturnFalse() && soIWontGetEvaluated()){ 
    System.out.println("I never get printed out :("); 
} 

그러나이 가정을 쉽게 확인할 수 있습니다. 데이터베이스가 충분히 큰 경우 그냥 몇 가지 검사를 해봐. 참조하는 방법

SELECT * FROM user WHERE password = '....' and username = '...' 

에 대한 및

SELECT * FROM user WHERE username = '...' 
+0

SQL은 프로그래밍 언어로 작성되지 않았습니다. 또한 SQL 쿼리의 기본 단락보다 조금 복잡합니다. –

+0

@Tomalak은 데이터베이스가 프로그래밍 언어와 동일한 원칙을 일부 사용한다고 생각하는 것이 타당합니다. – netbrain

+0

@netbrain : 그들이 근본적으로 다른 점을 이해한다면 아닙니다. –

-1

사용자 이름이 다음 다시 확인하는 쿼리를해야 할 것이다 일치하는 경우 첫 번째 방법은 두 번째와 같이 더 나은에 대한

SELECT * FROM user WHERE username = '...' and password = '...' 

수행 비밀번호

0

당신은 많은 세부 사항을 제공하지는 않지만, 일반적으로 2 번째 옵션으로갑니다. 잘못된 암호로 N 번 로그인 한 후 사용자를 신고하는 것과 같은 일을 할 수 있습니다.

아 물론 물론 해시 형태로 암호를 적절하게 임의의 소금으로 저장하고 일반 텍스트로 저장하지 마십시오.

0

나는 다음과 같은 이유로 후자를 선호하는 것 :

  • 당신은, 데이터베이스 (실패) 로그인 시도를 저장 할 수 있습니다 그것에 대해 당신은()에 관계없이 사용자 레코드를 필요로 정확한 암호.

  • 암호를 해싱해야하며 해시 알고리즘을 한 곳 (예 : PHP 코드)에만 구현해야 할 수 있습니다. 알고리즘이 변경되면 적어도 코드와 SQL 쿼리를 수정할 필요가 없습니다. 예 :

    클래스 사용자 {

    protected $ username; 보호 된 $ password_hash; protected $ salt;

    보호 된 기능 hashPassword ($ password) { return md5 ($ this-> salt. $ password); }

    공개 기능 checkPassword ($ password) { return ($ this-> hashPassword ($ password) == $ this-> password_hash); }

}

관련 문제