2010-08-18 8 views
11

서버가 사용자와 갖는 신뢰를 고려해 볼 수 있습니다.세션 하이재킹 및 PHP

세션 고정 : 전체 사이트에 대한 SSL 암호화 : 내가 사용하는 고정 "에도 session_regenerate_id()"만 인증에 (login.php)

세션 sidejacking을 방지하기 위해.

안전합니까?

감사합니다.

+0

어떤 종류의 사이트인가요? –

+9

@MrXexxed 개발자가 해킹을 원치 않는 사이트입니다. – rook

+0

@ 루크, 나는 OP에 말하고 있었는데, 그것은 진짜 질문이었고, 당신의 의견은 우스꽝스럽고 전혀 도움이되지 못했습니다. –

답변

28

OWASP A3-Broken Authentication and Session Management을 읽으십시오. OWASP A5-CSRF에 대한 내용도 있습니다.이 내용을 "세션 라이딩"이라고도합니다.

당신은 PHP는 헤더 파일에이 코드를 사용한다 :

ini_set('session.cookie_secure',1); 
ini_set('session.cookie_httponly',1); 
ini_set('session.use_only_cookies',1); 
session_start(); 

이 코드는 session fixation를 방지 할 수 있습니다. 또한 document.cookie에서 xss를 보호하는 데 도움이됩니다. 이는 Session Hijacking이 발생할 수있는 한 가지 방법입니다. HTTPS 전용 쿠키를 시행하면 OWASP A9-Insufficient Transport Layer Protection을 처리하는 좋은 방법입니다. HTTPS를 사용하는이 방법은 때로는 "보안 쿠키"라고 불리우며, 이는 끔찍한 이름입니다. 또한 STS은 매우 멋진 보안 기능이지만 모든 브라우저에서 지원하지는 않습니다 (아직).

+1

귀하의 답변은 적어도 +10을받을 자격이 있으며, 투표로 얻었습니다. 몇 가지 질문만으로도 이해할 수 있습니다. 1)'cookie_secure'는 세션 중에 https에서 항상 작동하도록 강요합니다. 그렇지 않습니까? 2)'cookie_httponly'는 무엇을합니까? 나는 PHP 설명을 읽었지 만, JS 양식 읽기 쿠키가 실제로 쿠키를 읽지 못하게한다고 말하면서 얻지 못합니다. 실제로 쿠키는 많은 상황에서 JS에 의해 읽혀 져야합니다. 고마워, 그리고 FYI : PHP 5.3.0 이후'session.use_only_cookies'는 기본적으로 1입니다. http://it.php.net/manual/en/session.configuration.php#ini.session.use-only-cookies –

2

또한 세션에 사용자 에이전트와 IP 정보를 저장하고 각 요청에 대해 확인하는 것이 좋습니다. 방탄은 아니지만 견고성이 상당히 향상되었습니다. UA 단조는 정말 쉽지만 가능하다면 IP 단조는 훨씬 어렵습니다 ...하지만 AOL 사용자와 같은 라운드 로빈 IP 시스템 뒤에있는 사용자에게는 문제가있을 수 있습니다 ...

+5

" ip forging "또는 더 일반적으로 ip 스푸핑이라고하는 것은 3 방향 핸드 쉐이크로 인해 인터넷을 통한 TCP 연결이 불가능합니다. 그러나 합법적 인 사용자의 IP 주소는 회사 네트워크의로드 밸런서 또는 wifi 핫스팟 변경으로 인해 세션 중에 변경 될 수 있습니다. – rook

+0

꽤 가능합니다. MITM 스타일의 공격이 필요합니다 (공격자가 엔드 포인트 라우터 중 하나에 액세스하여 원하는대로 할 수 있음) ... – ircmaxell

+1

해당 IP로 라우팅 된 패킷에 액세스 할 수있는 경우 "단조"되지 않습니다. –

0

모범 사례 i 세션 데이터를 데이터베이스 또는 텍스트 파일에 저장한다는 것을 발견했습니다. 데이터베이스는 사용자 에이전트와 IP 레코드를 가지며 세션이 다른 사람에 의해 절대로 하이재킹되지 않았는지 확인하기 위해 모든 요청을 확인합니다.

예를 들어 세션이 데이터베이스에 저장되는 방법을 통해 codeigntier 세션 라이브러리에서 구현을 볼 수 있습니다. 내 의견으로는이 방법은 공정하게 누군가가 세션을 납치하는 것을 막기 위해 저장합니다.

+3

사용자 에이전트를 검사하는 것은 공격자가 제어하는 ​​변수이므로 의미가 없습니다. 데이터베이스에 세션 ID를 저장하면 sql injection을 통해 공격자가 시스템에 즉시 액세스 할 수 있으므로 로그인 할 때 암호 해시를 해제 할 필요가 없습니다. IP 주소를 확인하는 것은 오류가 발생하기 쉽습니다. 예를 들어 회사 네트워크의로드 밸런서 뒤에있는 경우와 같이 합법적 인 시스템에서 변경 될 수 있기 때문입니다. – rook

+0

@Rook - 데이터베이스가 SQL 삽입에 취약하다고 가정합니다. 준비된 문이나 저장 프로 시저를 올바르게 사용하고 매개 변수를 적절하게 위생하면 SQL 주입이 허용되지 않습니다. – AgmLauncher

+0

@AgmLauncher 이것은 암호를 데이터베이스에 일반 텍스트로 저장하는 것과 같습니다. 실패 할 때 계획을 세워야합니다. – rook