실패한 로그인 시도를 기록하면 비밀번호가 노출됩니다


38

웹 사이트에서 다음과 같은 메시지로 로그인 시도 실패를 기록하기 시작했습니다.

Failed login attempt by qntmfred

이 로그 중 일부가 다음과 같이 보입니다.

Failed login attempt by qntmfredmypassword

일부 사용자는 사용자 이름 필드에 사용자 이름과 비밀번호를 입력하여 로그인에 실패한 것 같습니다. 암호는 데이터베이스에서 해시되지만 DB가 손상된 경우 이러한 로그 메시지는 공격자가 소수의 사람들이 이와 같이 로그인에 실패한 암호를 알아낼 수있는 방법이 될 수 있습니다.

이것을 처리하는 더 좋은 방법이 있습니까? 이 가능성에 대해 걱정해야합니까?


14
예, 걱정해야합니다.
— FoolishSeth


4
UX와 보안에 대한 흥미로운 질문입니다. Michael의 링크 중 하나에서 언급했듯이 Javascript (클라이언트 측)를 사용하여 대부분의 경우를 막을 수 있습니다. 비밀번호 필드가 비어있는 동안 로그인 버튼을 비활성화하십시오. 자바 스크립트가없는 사용자는 버튼을 사용할 수 없으므로 로그인 화면을 계속 사용할 수 있습니다.
— MSalters

답변:


65

다음과 같이 시도하십시오.

사용자 이름이 존재하면 "로그인 시도 실패 username"를 기록하십시오. 그렇지 않은 경우 123.45.67.89대신 " IP로 로그인 시도 실패 "를 기록하십시오. 실수로 로그에 비밀번호가 표시되는 문제를 해결해야합니다.


14
빈 암호를 확인한 경우 해당 오류로 인해 실패 할 수도 있습니다.
— Mike Weller

사용자 이름 인쇄는 OP가 설명하는 문제입니다. 사용자가 [tab] 키를 누락하고 사용자 이름 필드에 사용자 이름과 비밀번호를 모두 빠르게 입력하고 Enter 키를 누르면 로그인이 실패하는 경우가 있습니다. 당신의 제안은 이것을 다루지 않습니다.
— BZink

7
@BZink : 그렇습니다. 사용자 이름이 있으면 그대로 로그인하십시오. 사용자가 실수로 비밀번호를 사용자 이름에 추가하는 경우 결과 문자열도 거의 유효한 사용자 이름이 아닙니다.
— 메이슨 휠러

12

데이터베이스에 그러한 사용자 이름이 있는지 단순히 확인하지 않는 이유는 무엇입니까? 이것은 두 가지 가능한 결과를 남길 것입니다.

  1. 사용자가 올바른 사용자 이름을 입력했습니다. 그런 다음 지금 기록한 내용을 간단히 기록 할 수 있습니다.

  2. 사용자 이름 필드에 비밀번호를 입력 했으므로 사용자 이름이 유효하지 않습니다. 알 수없는 사용자의 로그인 시도가 실패했다는 로그 항목을 입력하십시오.

물론 IP, 날짜 및 기타 정보를 기록하는 추가 필드를 가질 수 있습니까?


3
# 2의 로그 항목에 사용자 이름의 해시를 추가하지 않겠습니까? 이렇게하면 암호가 숨겨 지지만 동시에 로그를보고있는 사람이 동일한 미확인 사용자가 여러 번 시도했는지 확인할 수 있습니다.
— emory

사용자 이름이 포함 된 레코드가없는 경우에는 이들이 잘못되었다는 것이 명백하므로 문제 해결에 여전히 유용합니다.
— JeffO

2
@emory, 사용자가 실수로 사용자 이름과 함께 암호를 입력 한 경우 문자열의 사용자 이름 부분 만 추출 할 수있는 방법이 없습니다. 그리고 반복적으로 사용자 이름 필드에 비밀번호를 입력하는 사람은 거의 없을 것 같습니다. 이것은 당신이하는 "일회성"실수입니다. 우리 중 최고에
— 이르렀지만,

@galdikas 사용자 이름에서 아무것도 추출 할 필요가 없습니다. 예를 들어, 비밀번호가 'password'인 'user'사용자입니다. 'userpassword'로 로그인하면 해시 함수가 'userpassword'를 17에 매핑합니다. 로그에 "식별되지 않은 사용자 17의 로그인 시도 실패"가 표시됩니다.
— emory

1
@galdikas 어쩌면 몇 번 이상 계속 할 정도로 어리 석거나 끈질긴 사람은 없지만 수천 번 할 수있는 어리 석고 끈기있는 스크립트가있을 것입니다. 차이점을 알고 싶지 않습니까?
— 모리

1

고려 사항 :

  1. 다른 사람이 자신의 사용자 이름을 잘못 사용하는 것과는 달리 언제 이런 일이 발생했는지 감지 할 수 있습니까? 잘못 입력 한 사용자 이름을 기록하면 지원 목적으로 유용 할 수 있습니다. 즉 "로그온 할 수없는"질문에 "사용자 이름을 잘못 입력 했으므로 점이 아닌 대시 여야합니다"또는 "대괄호가 있습니다" 그런 다음 공백-잘라서 붙여 넣었습니까? " 소수의 고가의 유료 사용자 (즉, 다른 소셜 네트워킹 사이트가 아님)가있는 경우 이러한 종류의 지원을 제공해야합니다.

  2. 누군가해야 할 적절한 조치는 무엇입니까? 사용자 이름은 해킹 시도의 지표 일 수 있습니다. 사용자 이름이 목록에 나타나지 않는다고해서 그것이 무엇인지 알 필요는 없습니다. 그러나 이것이 심각한 문제라고 생각하고 암호가 누구인지 감지 한 경우, 암호가 변경된 후 사용자에게 암호를 변경하도록 요구할 수 있습니다.

  3. 산업 관행이란 무엇입니까? 산업 관행은 사용자 이름 필드는 기록하지만 암호 필드는 기록하지 않습니다. 당신은이 일을 해고 당하지 않을 것입니다.

일반적인 고려 사항이없는 한 다음과 같은 업계 관행을 따르고 사용자 이름 필드를 기록하십시오. 이것이 적절하지 않다고 생각되면 강제 암호 변경을 제안 2로 고려하십시오.


1

안전을 위해 현재 앱에 로그인하면 로그인 또는 비밀번호 재설정 메소드에 전달 된 매개 변수가 저장되지 않습니다. 로그 호출에는이를 제어하는 ​​선택적 매개 변수가 있습니다. true로 설정하면 저장된 매개 변수 오브젝트가로 대체됩니다 [Redacted]. 물론 약간의 데이터를 놓치지 만 IP 주소가 있으므로 평문에서 민감한 것을 얻는 위험은 없습니다.

이런 종류의 것을 실제로 기록하려면 로그인 시도를 기록 할 때 사용자 이름 필드에있는 이름과 일치하는 이름의 사용자를 데이터베이스에서 확인하고 일치하는 경우에만 저장하는 것이 좋습니다. 그렇지 않으면 "알 수없는 사용자"로 저장하면됩니다. 이 값에 그 값이 포함되어 있는지 확인하면 멋지게 보일 수 있지만 항상 [User] [Password] 및 [UserPas] [sword]와 같은 조합이 발생할 위험이 있습니다.이 경우 IP를 확인하여 추론 할 수 있습니다 실수로 다른 사람의 비밀번호 시작을 빈 공간에 저장했습니다. 불가능한 [User] [Password] 및 [UserPassword] [??]로이를 확장 할 수 있습니다.이 경우 "UserPassword에 의한 로그인 실패"와 "사용자에 의한 로그인 실패"가 표시되고 모두 추론 될 수 있습니다.사용자 비밀번호. 일반적으로 안전을 위해 로그인에 성공하지 않는 한 사용자 이름을 기록하지 말고 싶습니다.

추가하려면 다음을 편집하십시오.

실패한 로그인 시도에 대해 사용자 이름을 기록하기 위해 사람들이 게시하는 대부분의 주장은 다른 방법으로 더 잘 처리됩니다.

예를 들어, 고객이 "왜 로그온 할 수 없습니까?"라고 물으면 로그인 한 사용자 이름으로 오타를 지적 할 수 있다고합니다. 이것은 사실이지만 암호를 잡을 위험도 없습니다. 대신 실패시 사용자를 로그인 양식으로 다시 리디렉션하고 사용자 이름 필드를 강조 표시하고 사용자가 직접 볼 수 있도록 입력 한 내용으로 다시 채 웁니다.

또 다른 주장은 해킹 시도를 식별 할 수 있다는 것입니다. 하나의 사용자 이름에 대한 일련의 실패는 암호를 무차별 적으로 시행하려는 시도 일 수 있습니다. Users 테이블에 "BadLogins"열을 사용하여이 작업을 수행합니다.이 열은이 사용자와 일치하는 사용자 이름으로 로그인이 실패 할 때마다 증가하며, 로그인이 성공하면 사용자에게 " x 마지막 로그인 이후 실패한 로그인 시도 "및 사용자가 시도한 것이 아닌 경우 어떻게해야하는지 조언합니다. 실제로 철저히 로그인하려면 로그인 후에도 BadLogins 열의 마지막 값을 저장하는 다른 열 및 / 또는이 열의 가장 높은 값을 저장하는 열 및 / 또는 이 계정에 발생한 총 로그인 실패 횟수를 저장합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.