2013-01-02 4 views
11

나는 '기억 해요'가 포함 된 로그인 양식을 코딩하는 중이며, 지금까지 읽은 자습서 (부분적으로는 내가 올바르게하고 있는지 확인하기 위해)는 암호화 된 암호를 사용자 이름과 함께 쿠키. 그런 다음 PHP가 현재 사용자가 로그인하지 않았는지 확인 할 때마다 쿠키를 확인하고 그 값을 찾습니다. 사용자 이름이 암호와 일치하면, 안으로 들어갑니다.PHP "Remember Me"보안 결함이 있습니까?

저에게 이것은 거친 보안 구멍입니다. 누군가 데이터베이스를 해킹하거나 암호화 된 암호에 액세스하는 경우 암호를 해독 할 필요조차 없습니다. 너의 자신의 과자를 놓고가 거라. 나는 올바른가, 아니면 단지 편집증인가?

내 로그인 시스템은 현재 사용자 ID를 추적하기 위해 세션을 사용하고 빠른 로그인/로그 아웃 확인을 위해 1/0을 사용합니다. 사용자가 AFAIK 세션을 편집 할 수 없으므로 안전합니다 (그렇지 않은 경우 알려주세요). 세션 ID를 쿠키에 저장하고 나중에 다시 시작하려고 생각했지만 안전하지 않습니다.

사용자의 보안이 중요합니다. 제대로 작동하는 웹 사이트를 유지하면서 정보를 적절히 보호하려면 어떻게해야합니까?

+0

암호화 된 암호를 저장하지 않고 단지 X 일 후에 만료되는 쿠키에 user_ID 만 저장합니다. "민감한"영역 (예 : 계정/프로필 관리)의 경우 유효한 $ _SESSION (로그인 할 때 설정해야하는)이없는 경우 로그인을 요구할 수 있습니다. – JennyDanger

+1

쿠키에 저장하는 것이 "안전하지 않은"경우 세션 ID를 어떻게 저장합니까? –

+0

@georgefox 현재, 세션 ID는 아무 것도 저장하지 않고 있습니다. 기억하는 기능이 있다고 말하는 것입니다. – Scott

답변

11

일반적으로, 그것은 정상 세션 쿠키 옆에 추가 쿠키를 발행하고,이 새로운 문자열은 사용자 이름과 그것을 추측 할 수 있도록 임의의 문자의 합리적인 금액을 포함하고 있습니다. 이것은 데이터베이스에 분명히 저장되어 있습니다 (보안상의 이유로 암호처럼 취급하여 소금과 해시를 할 수 있습니다). 다음에 사용자가 동일한 브라우저에 연결하면 (이전 세션이 만료되었다고 가정하면) 응용 프로그램은 임의의 문자열로 데이터베이스를 검사하고 일치하는 경우 사용자를 인증합니다.

다른 방법으로 세션 만료 시간을 어느 정도 앞당기 고 있습니다.

여기 보안 허점은 무엇입니까? 좋은 무작위 생성기를 사용한다면 사용자는 공유 브라우저에서 응용 프로그램에 액세스하고 끝나면 수동으로 로그 아웃하지 않을 수 있습니다. 당신이 안전하지 않은 채널에 있기 때문에

정상 규칙

항상 적용 HTTPS를 사용, 그렇지 않으면 누구든지 컴퓨터와 쿠키를 훔칠 수있는 서버 사이에 앉아, (세션 중 하나 또는 기억 - 나 일) 및 마치 당신처럼 행동하십시오.

Bonus, this must-read by Jeff Atwood

+0

이것은 좋은 방법 인 것 같습니다, 감사합니다! 또한, 그 괴물 로그인 게시물을 지금 읽고! – Scott

-3

내 웹 사이트에서 작업하는 동안 동일한 문제가 발생했습니다. 문제를 해결하기 위해 가장 좋은 방법은 암호를 기억하지 않고 사용자 이름 만 사용하여 빠른 로그인을 제공하지만 안전하지는 않은 방법입니다. 사실 암호를 절대적으로 안전하게 유지하는 확실한 방법이 없다는 것입니다. 새로운 브라우저 외에도 사용자는 브라우저가이를 기억하도록 할 수 있습니다. 당신이 저장된 암호가 있어야합니다 경우

그러나,이 시도 :

여러 쿠키를, 2가 가장 쉬운 것, 그리고 암호화 된 암호를 사용하는 암호화 키를 개최 다른 동안. 데이터베이스의 암호는 저장된 암호화 키를 사용하여 얻은 추가 암호화 된 암호를 보유합니다. 암호를 확인할 준비가되면 값을 추출하고 암호를 암호화하십시오.

희망이있었습니다. 행운을 빕니다!

편집 : 사용자가 여전히 로그인되어있는 경우 오해가 있었을 수도 있습니다. 세션 변수를 저장하는 것이 좋습니다. 사용자을 기억 서버가 에 요청 될 때

+1

클라이언트에서는 어떤 식 으로든 암호를 저장하지 마십시오 (로그인하는 데 사용할 수있는 암호화 된 암호는 여전히 암호 임). 서버에 저장된 키만 저장하십시오. 이 키는 나중에 폐기 될 수 있지만 암호화 된 암호는 변경 될 때까지 유효합니다. –

+0

만료일을 설정하기 때문에 반드시 그렇지는 않습니다. 그러나 나는 두 번째 방법을 사용하지 않을 것이다. – Zero

0

당신은 그것을 보호하려는 사용자들이 로그인 유지 할 수 있도록 해달라고합니다.

세션을 설정하는 경우, 즉 누군가가 집어 경우, 그래서 세션 ID에 IPADDRESS을 결합해야합니다 세션을 나중에 동일한 IP 주소에서만 수행 할 수 있습니다. Yo는 (해쉬 된) 세션 ids + 해시 된 IP 주소로 데이터베이스를 유지함으로써이 작업을 수행 할 수 있습니다. 나는 phps 함수 http://php.net/manual/en/class.sessionhandler.php을 사용하여 세션 처리기를 설정하고 세션을 ipaddress와 일치시킵니다.

+1

IP 주소는 보안을 위해 사용되지 않으므로 IP 주소를 신뢰할 수 없습니다. 당신이 지적한대로, IP 수표는 여전히 나쁜 사람들을 위해 삶을 어렵게 만듭니다. –

2

클라이언트에서 암호를 저장하지 마십시오 (로그인하는 데 사용할 수있는 암호화 된 암호는 여전히 암호 임).

무작위로 생성 된 키를 사용하여 서버에 안전하게 저장합니다. 이러한 키는 나중에 변경 될 때까지 유효한 암호화 된 암호와 달리 취소 될 수 있습니다.

PHP를 사용하면 md5(uniqid(mt_rand(), true))과 같은 임의의 키를 생성 할 수 있습니다. 더 나은 안전 보관을 위해 소금물에 담근 후 해시되었습니다.

예 테이블 :

login_keys (
    user_id int, 
    key char(40), # sha1 
    salt char(15) 
) 

또한 당신이 단지 쿠키를 옵션을 HTTP를 사용하도록 설정해야합니다 유의하십시오.