2010-07-14 3 views
1

$ _SERVER md5 ($ _ SERVER [ 'remote_addr'] + $ _SERVER [ 'http_user_agent'])))를 cookie_auth 필드에 사용하는 것이 좋은 생각이라면 내 사이트에 php를 사용하고 있습니다. 사용자 테이블이 쿠키는 http 쿠키 대신 사용할 수 있습니까?

사용자가 로그인하면 php는 위의 키를 사용하여 현재 사용자를 다시 확인하고 저장된 키와 비교하고 일치하는 경우 사용자에 대해 신임을받습니다.

문제는 사용자 에이전트가 변경되고 IP가 변경 될 수 있다는 것입니다. 내 주요 관심사는 사용자 사용자 에이전트입니다. IP 주소는 일반적으로 1 ~ 2 달 동안 유지되며 내 기본 사용자 기반에는 고정 IP 주소 (회사)가 있으므로 문제가되지 않아야합니다.

휘발성이 낮을 수도 있지만, 동적 일 수있는 다른 PHP $ _SERVER 변수가 있습니까?

나는 PHP의 매뉴얼을 가지고있다.하지만 나는 아무런 쓸모가 없다. 어쩌면 나는 뭔가를 놓친다.

다른 개발자가 이와 비슷한 것을 구현합니까?

생각하십니까?

더 좋은 방법이 있나요?

+0

많은 이론적 인 답변을 왜 shouldn. Pray tell : 당신이 해결하려고 시도하고있는 실제 문제는 무엇입니까? 당신은이 경로를 시험해보고 싶어 했습니까? – Wrikken

답변

2

프록시 때문에 작동하지 않습니다. 동일한 사용자 에이전트가있는 두 명의 사용자가 방문하면 재난입니다.

일부 프로젝트는 세션 ID를 사용하는 모든 URL의 GET 변수에 전달하여 "쿠키없는 세션"을 수행 할 수 있습니다.

PHP는 실제로이 작업을 자체적으로 수행 할 수 있습니다. 그리고 PHP를 강제로 not use cookies at all으로 만들 수도 있습니다. 그냥 GET 변수로 전달하십시오.

그러나 몇 가지 단점이 있습니다. 자바 스크립트 코드에서 응용 프로그램의 URL을 호출하는 경우, 거기에 세션 ID를 삽입해야합니다. 또한 외부 링크가있는 경우 세션 ID를 referer (sic) HTTP 매개 변수를 통해 제 3 자에게 제공 할 수 있으므로 잠재적 인 세션 도용이 발생할 수 있습니다. XSS 구멍에 신중해야합니다. 응용 프로그램의 로그인 절차 중에 발생하는 세션 고정에주의해야합니다. 등등.

1

내 기본 사용자 기반은 고정 IP 주소 (회사) 하나 (모두 같은 브라우저와, 동일한 외부 IP 주소) MegaCorp에서 persone가 로그인 할 경우

그래서, 모든 사람이있다 로그인? 하지 마.

또 다른 이유는 동일한 영역 (동일한 프록시, 동일한 브라우저)에있는 모든 iPhone이 로그인했기 때문입니다. 침입하기 위해해야 ​​할 일은 단지 수백 미터 (일부 장소에서는 몇 킬로미터) 이내가되는 것입니다. 누군가 액세스 권한이 있으며 자동으로 부여됩니다.

은 (이러한 질문의 대부분이 발생한 곳이다)에 '암호없이 로그인'을 가지고 일반적으로 2 가지 방법이 있습니다

  • 쿠키 이전 로그인에서 충분한 '추측 할 수없는 해시'로
  • 설득 사용자가 HTTPS를 통해 유효성을 검사 할 수있는 인증서를 설치합니다.
+0

PHP가 사용할 수있는 다른 고유 한 식별자가 있습니까? – payling

+0

아니요, 쿠키 및/또는 SSL 인증서. – Wrikken

+0

좋아요, 제가 제안하려고하는 것은 아마도 쿠키 또는 certs를 사용하는 것 외에는 미친 짓일 것입니다. 그러나 토론을 위해 이론적으로 다음과 같이 할 수는 없습니다. 1) 캐시가 없거나 만료 된 HTTP 헤더가있는 1x1 이미지를 파일 이름이 쿠키에 저장되는 해시 또는 2) 이미지를 전달하는 해더 AJAX를 통해 반환 될 때 이미지 데이터 (또는 심지어 차원) 내의 정보를 고유하게 식별 할 수 있습니까? –

0

대부분의 $_SERVER 변수는 공격자가 제어합니다 (remote_addr은 TCP 소켓에서 직접 가져 오므로 스푸핑되거나 다른 방법으로 변조 될 수 없습니다). 그러나 공격자는 사용자 에이전트를 다른 것으로 변경할 수 있습니다.

위알을 다시 발명하지 마십시오. session_start()$_SESSION super-global은 안전하고 구현하기 쉽고 견고합니다. 이것을 사용하려면 모든 페이지의 헤더 파일에 항상 session_start()을 호출해야합니다. login.php에서 다음

if(!$_SESSION[logged_in]){ 
    header("location: login.php"); 
    die();//Yes php keeps executing so you need this! 
} 

:

if(login($_REQUEST[user],$_REQUEST[password])){ 
    $_SESSION[logged_in]=true; 
} 
+0

죄송합니다. 분명하지 않습니다. 나는 "쿠키"를 저장하기 위해 데이터베이스를 사용하는 것을 제외하고는 쿠키가 무엇을하는지 (사용자가 브라우저를 닫고 나중에 다시 로그인 할 필요없이 다시 돌아올 수 있도록) 시뮬레이션하려고합니다. 브라우저가 닫히지 않는 한 세션은 잘 작동합니다 (현재 사용하고있는 콘텐츠입니다). – payling

+0

@payling 그래서 무한정 * 작동하는 세션이 필요하며 브라우저가 닫힐 때만 삭제됩니까? 데이터베이스에 세션 ID를 저장하는 방법은 매우 나쁘지만 SQL 주입으로 얻을 수 있으며 인증에 사용됩니다. – rook

+0

remote_addr 기능을 스푸핑 할 수 없다는 것을 알지 못했습니다 ... 도움이됩니다! 이제 나는 이것을 알 수 있습니다. 로그인 할 때 remote_addr + ip가 저장되도록 할 수 있습니다. 사용자가 다시 로그온 할 때 해당 값에 대한 일치 항목을 발견 할 때까지 users 테이블을 검색 할 수 있으며 그 값은 사용자가됩니다. – payling

관련 문제