2012-03-26 5 views
1

이 질문이 전에 제기 된 경우 사과드립니다. 내가 이해하는 방식으로 사물을 설명하는 답을 찾는 데 어려움을 겪고 있습니다.공유 서버 보안 쿠키 로그인

나는 공유 리눅스 서버를 사용하여 PHP/mysql 사이트 또는 두 곳을 호스팅하고 있습니다. 세션 (세션 데이터가 데이터베이스에 저장되어 있음)을 사용하는 관리 영역에 대한 로그인 코드를 작성했으나 문제는 20 분 정도 지나면 세션 시간 초과입니다. 나는 호스팅 제공 업체와 통화했으며, 내가 이것을 변경할 수있는 방법이 없다는 것을 알 수 있습니다. htaccess와 개별 php.ini 파일에서 gc_maxlifetime을 변경하려고 시도했습니다. 둘 중 하나가 시스템을 중단 시키거나 작동하지 않습니다. 접대 공급자는 나의 시도가 아마 무익하다는 것을 확인했다.

그래서 쿠키를 테스트로 사용하도록 전환했습니다. 그러나 나는 이제 보안 문제가 우려된다. 내가 저장 한 쿠키 (username/shar 암호화 된 암호, 사용자 에이전트/remote_address, 토큰 및 일부 시간 관련 항목)는 쿠키에서 모두 암호화 된 AES이며 일부 소금, IP 검사 및 여러 번의 잘못된 로그인 이후 잠김을 사용합니다. 시도.

토큰은 로그인해도 변경되며 실제로 보호되는 데이터베이스에 저장됩니다. 나머지 항목은 로그인 한 사용자에 대해 올바른 데이터가 표시되는지 확인합니다. 그 토큰이 내가 가지고있는 유일한 보호 수단이라는 점에 우려하고 있습니다. 호스트에 대한 제 제약 조건을 감안할 때 몇 가지 제안/도움을 얻을 수 있거나 더 나은 솔루션을 제공하거나 적어도 내가 한 것에 더 많은 코드를 추가 할 수 있기를 기대했습니다.

아마도 내가 완전히 잘못된 방법으로 갔을 것입니다. 그냥 다시 반복 처리를하기까지 내가 세션 20 분 :(후 타이밍을 중지 얻이 수없는 것 말할 수 있습니다.

감사합니다 사전에 어떤 도움.의 끔찍한 방법입니다

+0

왜 가능하지 않은지 이유를 제공자에게 문의해야합니다. – Gumbo

+0

@Gumbo 내가 겪고있는 문제는 실제로 내가 사용하는 여러 호스팅 제공 업체와 함께 일어나고 있습니다. 그들은 영국에서 잘 알려진 제공자입니다. 나는 왜 그들에게 이전에 물어 보았습니다. 그리고 그것들은 그들의 서버가 설치된 방식이라고 말합니다 - 그것보다 더 많은 정보를 제공하지 마십시오! 나는 php_value session.cookie_lifetime 3600을 사용하여 htaccess를 리셋하려고 시도했지만 내부 서버 오류가 발생합니다. 내 자신의 로컬 버전을 추가 php.ini에 관해서는 그것도 작동하지 않는 것 :(.한 가지 대답은 호스트를 이동하는 것입니다 - 나는 다른 사람이 같은 큰 호스팅 제공 업체와 같은 문제가없는 이상한 찾습니다. – kaliok

답변

1

을 어떤 이유로 든 세션 ID를 생성해서는 안되며, 세션 ID는 만료되지 않으며 공격자가 해킹하여 다시 로그인 할 수있는 수단이 있어야합니다. ID 항상cryptographic nonce이어야합니다. 세션 토큰을 생성하는 PHP의 방법은 좋지 않지만 향상시킬 수 있습니다. 엔트로피 소스로/dev/random을 사용할 수 있습니다.

당신은이 문제를 해결하기 위해 위아래를 재발견하면 안됩니다. session.cookie_lifetimesession.gc_maxlifetime 값을 설정하고 session_start()$_SESSION 수퍼 전역을 사용할 수 있어야합니다. 관심이 있으신 분은 post on PHP Sessions입니다.

정말로 자신 만의 세션 핸들러를 만들려면 SQL 테이블을 만듭니다. 이 테이블의 경우 세션 ID로 키를 사용하고 session_id()으로 생성하십시오. PHP의 setcookie()을 사용하고 HTTPOnlySecure 비트와 같은 보안 플래그를 설정해야합니다. 새 레코드를 데이터베이스에 삽입하고 시간 제한 값이 있는지 확인하십시오. 이 로그인 시스템의 가장 큰 문제점은 sql injection입니다. 공격자가 암호 해시를 해지하지 않고 세션 ID와 로그인을 얻을 수 있기 때문입니다.

+0

안녕하세요, 귀하의 빠른 답변에 감사드립니다. 나는 아직도 조금 길을 잃을 까봐 걱정된다. 전에 언급 한 세션에 대한 게시물을 보았지만 언급 한 20 분 지난 세션을 가질 수 없었습니다. 아마도 나는 코드를 잘못된 위치에 두었습니다. 나는 또한 당신이 만든 SQL 테이블 세션 처리기 제안을 구현하는 방법을 잘 모르겠다 - 나는 다음과 같은 아이디어를 사용했다 - http://shiflett.org/articles/storing-sessions-in-a-database - 그리고 그것은 작동하는 것 같다. . 그러나 - 나는 여전히 호스팅 제공 업체의 시간 초과 문제와 동일한 문제가 있습니다. 쿠키에 대한 도움을 받기를 희망했습니다. – kaliok

+0

@kaliok, 좀 더 구체적으로 설명해 주셔서 죄송합니다. 매우 큰 난수와 SQL 쿼리를 포함하는 쿠키 만이 상태를 끌어 올뿐 아니라 그보다 훨씬 간단합니다. – rook

+0

다시 한번 감사드립니다. 나는 약속하려고 노력하고 있지만 당신이 더 구체적이어야한다고 말하면 무슨 뜻인지 확신 할 수 없습니다. dev/random은 당신이 말하고있는 큰 난수입니다 - 쿠키에 넣어야한다고 말하는가? – kaliok