복붙노트

PHP 세션 변수는 얼마나 안전합니까?

PHP

PHP 세션 변수는 얼마나 안전합니까?

'사용자'테이블의 데이터에 대한 사용자 이름 / 암호를 확인하는 로그인 스크립트가 있습니다. 또한 주어진 사용자의 액세스 수준을 지정하는 '역할'테이블이 있습니다. 안전한 로그인 스크립트를 사용 중이라고 가정하면, 성공적인 로그인시 'roles'테이블에 대한 추가 쿼리를 수행하여 사용자의 권한 수준을 발견하고이를 세션 변수에 저장하는 것에서 보안 허점이 있습니까? 아이디어는 혼합 된 권한이있는 페이지에서 세션 변수를 쿼리하여 로그인 된 사용자의 권한 수준을 검색 할 수 있습니다.

감사.

해결법

  1. ==============================

    1.세션은 쿠키보다 훨씬 안전합니다. 그러나 세션을 도용 할 수 있으므로 해커는 해당 세션에있는 모든 항목에 대한 전체 액세스 권한을 갖습니다. 이것을 피할 수있는 몇 가지 방법은 IP Checking (매우 잘 작동하지만 매우 낮기 때문에 자체적으로 신뢰할 수는 없습니다)과 nonce를 사용하는 것입니다. 일반적으로 nonce를 사용하면 각 페이지가 마지막 페이지의 nonce가 저장 한 내용과 일치하는지 확인하는 페이지 당 "토큰"을 갖게됩니다.

    세션은 쿠키보다 훨씬 안전합니다. 그러나 세션을 도용 할 수 있으므로 해커는 해당 세션에있는 모든 항목에 대한 전체 액세스 권한을 갖습니다. 이것을 피할 수있는 몇 가지 방법은 IP Checking (매우 잘 작동하지만 매우 낮기 때문에 자체적으로 신뢰할 수는 없습니다)과 nonce를 사용하는 것입니다. 일반적으로 nonce를 사용하면 각 페이지가 마지막 페이지의 nonce가 저장 한 내용과 일치하는지 확인하는 페이지 당 "토큰"을 갖게됩니다.

    어느 보안 검사에서도 사용성이 떨어집니다. IP 검사를하고 해당 사용자가 고정 IP를 보유하지 않는 인트라넷 방화벽 (또는이 문제를 일으키는 다른 상황)에 노출 된 경우 IP를 잃을 때마다 다시 인증을 받아야합니다. 논스를 사용하면 항상 "클릭하면이 페이지가 중단됩니다"라는 재미를 얻을 수 있습니다.

    그러나 쿠키를 사용하면 해커가 간단하게 XSS 기술을 사용하여 세션을 도용 할 수 있습니다. 사용자의 세션 ID를 쿠키로 저장하면이 세션 ID도 취약합니다. 따라서 세션이 서버 수준의 해킹을 수행 할 수있는 사람에게만 침투 할 수 있다고하더라도 (서버가 안전하다면 훨씬 더 정교한 방법과 보통 어느 정도의 권한이 필요합니다.), 당신은 여전히 ​​추가적인 검증 레벨이 필요합니다 각 스크립트 요청시. 쿠키와 AJAX를 함께 사용해서는 안됩니다. 쿠키를 도난 당하면 마을로가는 것이 훨씬 쉽습니다. 왜냐하면 아약스 요청은 각 요청에 대해 보안 검사를받지 못할 수 있기 때문입니다. 예를 들어, 페이지가 nonce를 사용하지만 페이지가 다시로드되지 않으면 스크립트는 해당 일치 항목 만 검사 할 수 있습니다. 그리고 쿠키에 인증 방법이 있으면 지금 도난당한 쿠키와 AJAX 구멍을 사용하여 마을에 가서 악의적 인 행동을 할 수 있습니다.

  2. ==============================

    2.서버에서 실행중인 스크립트 만 _SESSION 배열에 액세스 할 수 있습니다. 세션 쿠키의 범위를 정의하면이를 특정 디렉토리로 제한 할 수도 있습니다. 누군가가 그 세션 데이터를 얻을 수있는 유일한 방법은 일부 PHP 코드를 페이지 중 하나에 삽입하는 것입니다.

    서버에서 실행중인 스크립트 만 _SESSION 배열에 액세스 할 수 있습니다. 세션 쿠키의 범위를 정의하면이를 특정 디렉토리로 제한 할 수도 있습니다. 누군가가 그 세션 데이터를 얻을 수있는 유일한 방법은 일부 PHP 코드를 페이지 중 하나에 삽입하는 것입니다.

    사용중인 시스템에 대해서는 허용되고 데이터베이스 호출을 저장하는 좋은 방법이지만, 적용 할 인증 변경 사항에 대해서는 사용자가 로그 아웃했다가 다시 로그인해야합니다. 따라서 계정을 잠그고 해당 사용자가 이미 로그인 한 경우에는 로그인 할 수 없습니다.

  3. ==============================

    3.Apache에서 PHP $ _SESSION 수퍼 글로벌은 가상 호스트를 통해 액세스 할 수 있다는 점에 유의해야합니다. 이 시나리오를 고려하십시오.

    Apache에서 PHP $ _SESSION 수퍼 글로벌은 가상 호스트를 통해 액세스 할 수 있다는 점에 유의해야합니다. 이 시나리오를 고려하십시오.

    서버에서 모든 가상 호스트를 제어 할 때 큰 문제는 아니지만 공유 시스템에있는 경우 문제가 발생합니다.

  4. ==============================

    4.세션 변수에 저장된 값을 사용하여 역할을 결정하면 DB의 값을 변경하고 사용자의 현재 세션에 반영 할 수있는 능력을 잃게됩니다. 젠드 프레임 워크를 살펴보면, 인증과 권한 부여가 명확하게 구분되어 있으며 설명서에있는 단어의 경고는 세션에 최소한의 데이터 만 저장한다는 의미입니다 (예 : "Yup, 그는 user # 37 & he logged in"). .

    세션 변수에 저장된 값을 사용하여 역할을 결정하면 DB의 값을 변경하고 사용자의 현재 세션에 반영 할 수있는 능력을 잃게됩니다. 젠드 프레임 워크를 살펴보면, 인증과 권한 부여가 명확하게 구분되어 있으며 설명서에있는 단어의 경고는 세션에 최소한의 데이터 만 저장한다는 의미입니다 (예 : "Yup, 그는 user # 37 & he logged in"). .

    '안전'에 관한 한 - 공유 호스트에 있지 않으면 걱정할 것이 없습니다. 적절하게 구성된 공유 호스트에서는 비교적 안전해야합니다.

  5. from https://stackoverflow.com/questions/1181105/how-safe-are-php-session-variables by cc-by-sa and MIT license