복붙노트

PHP 세션 보안

PHP

PHP 세션 보안

PHP로 책임감있는 세션 보안을 유지하기위한 지침은 무엇입니까? 웹상에 정보가 있으며, 모두 한 곳에서 정보를 얻을 수 있습니다.

해결법

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

    1.

    세션 보안을 유지하기 위해 수행해야 할 몇 가지 작업이 있습니다.

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

    2.

    한 가지 지침은 세션의 보안 수준이 변경 될 때마다 session_regenerate_id를 호출하는 것입니다. 이렇게하면 세션 도용을 방지하는 데 도움이됩니다.

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

    3.

    내 두 (또는 그 이상) 센트 :

    Chris Shiflett의 필수 PHP 보안 :이 주제에 관해 작지만 훌륭한 책이 있습니다.

    필수 PHP 보안 http://shiflett.org/images/essential-php-security-small.png

    이 책의 홈 페이지에는 흥미로운 코드 예제와 샘플 챕터가 있습니다.

    위에서 설명한 (IP 및 UserAgent) 기술을 사용할 수 있습니다. 여기서는 신원 도용을 방지하는 방법을 설명합니다.

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

    4.

    필자는 PHP 6에서 다루고있는 주요 문제 중 하나가 register_globals라고 생각합니다. 현재 register_globals를 피하는 데 사용되는 표준 메소드 중 하나는 $ _REQUEST, $ _GET 또는 $ _POST 배열을 사용하는 것입니다.

    "올바른"방법은 (5.2로, 약간 버그가 있지만 곧 안정화 될 예정이며 6 시까 지) 필터를 사용합니다.

    그래서 대신 :

    $username = $_POST["username"];
    

    너는 할 것이다 :

    $username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
    

    또는 단지 :

    $username = filter_input(INPUT_POST, 'username');
    
  5. ==============================

    5.

    이 세션 고정 문서는 공격이 올지 모를 아주 좋은 지침을 제공합니다. Wikipedia의 세션 고정 페이지를 참고하십시오.

  6. ==============================

    6.

    IP 주소를 사용하는 것은 제 경험상 최고의 아이디어는 아닙니다. 예를 들어; 우리 사무실에는 부하에 따라 사용되는 두 개의 IP 주소가 있으며 IP 주소를 사용하여 문제가 끊임없이 발생합니다.

    대신, 내 서버의 도메인에 대한 별도의 데이터베이스에 세션을 저장하도록 선택했습니다. 이렇게하면 파일 시스템에 아무도 해당 세션 정보에 액세스 할 수 없습니다. 이것은 3.0 이전의 phpBB에 도움이되었습니다 (이후이 문제가 수정되었습니다).하지만 여전히 좋은 생각입니다.

  7. ==============================

    7.

    이것은 꽤 사소하고 분명한데 매번 사용 후에 session_destroy를 사용해야합니다. 사용자가 명시 적으로 로그 아웃하지 않으면 구현하기가 어려울 수 있으므로 타이머가이를 수행하도록 설정할 수 있습니다.

    다음은 setTimer () 및 clearTimer ()에 대한 유용한 자습서입니다.

  8. ==============================

    8.

    PHP 세션과 보안 (세션 하이재킹 외)의 주된 문제점은 현재 어떤 환경에 있는지와 함께 있습니다. 기본적으로 PHP는 세션 데이터를 OS의 임시 디렉토리에있는 파일에 저장합니다. 특별한 생각이나 계획이 없으면 이것은 세계가 읽을 수있는 디렉토리이므로 모든 세션 정보는 서버에 액세스 할 수있는 모든 사람에게 공개됩니다.

    여러 서버에서 세션을 유지 보수하는 경우. 이 시점에서 세션 데이터를 CRUD (작성, 읽기, 업데이트, 삭제)하기 위해 제공된 함수를 호출하는 사용자 처리 세션으로 PHP를 전환하는 것이 좋습니다. 이 시점에서 세션 정보를 데이터베이스 나 memcache와 같은 솔루션에 저장하여 모든 응용 프로그램 서버가 데이터에 액세스 할 수 있도록 할 수 있습니다.

    자신의 세션을 저장하는 것은 공유 서버에있는 경우 유용 할 수 있습니다. 왜냐하면 공유 된 서버에 저장하면 데이터베이스에 저장할 수 있기 때문입니다.

  9. ==============================

    9.

    내 세션을 이렇게 설정 했어.

    로그인 페이지에서

    $_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR']);
    

    (구성 페이지에 정의 된 문구)

    나머지 사이트 전반의 헤더에 다음과 같이 입력하십시오.

    session_start();
    if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] . PHRASE . $_SERVER['REMOTE_ADDR'])) {       
        session_destroy();
        header('Location: http://website login page/');
        exit();     
    }
    
  10. ==============================

    10.

    session.cookie_httponly = 1
    change session name from default PHPSESSID
    
    X-XSS-Protection    1
    
  11. ==============================

    11.

    IP와 사용자 에이전트가 모두 변경되었는지 확인합니다.

    if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']
        || $_SESSION['user_ip'] != $_SERVER['REMOTE_ADDR'])
    {
        //Something fishy is going on here?
    }
    
  12. ==============================

    12.

    session_set_save_handler ()를 사용하는 경우 자체 세션 핸들러를 설정할 수 있습니다. 예를 들어 세션을 데이터베이스에 저장할 수 있습니다. 데이터베이스 세션 핸들러의 예제는 php.net 주석을 참조하십시오.

    DB 세션은 파일 기반 세션을 사용하는 경우 여러 서버가있는 경우에도 유용합니다. 각 웹 서버가 세션 읽기 / 쓰기를 위해 동일한 파일 시스템에 액세스해야합니다.

  13. ==============================

    13.

    세션 데이터가 안전한지 확인해야합니다. php.ini를 보거나 phpinfo ()를 사용하여 세션 설정을 찾을 수 있습니다. _session.save_path_는 저장 위치를 ​​알려줍니다.

    폴더와 그 부모의 허가를 확인하십시오. 공유 서버 (/ tmp)가 아니거나 공유 서버의 다른 웹 사이트에서 액세스 할 수 없습니다.

    여전히 PHP 세션을 사용한다고 가정하면 _session.save_handler_를 변경하여 _session.save_path_를 변경하거나 데이터베이스의 데이터를 저장하여 다른 폴더를 사용하도록 PHP를 설정할 수 있습니다.

    사이트 루트 폴더의 .htaccess 파일에서 php.ini (일부 공급자 허용) 또는 apache + mod_php의 _session.save_path_를 설정할 수 있습니다. php_value session.save_path "/home/example.com/html/session". _session_save_path () _를 사용하여 런타임에이를 설정할 수도 있습니다.

    Chris Shiflett의 튜토리얼 또는 Zend_Session_SaveHandler_DbTable을 설정하여 대체 세션 핸들러를 설정하십시오.

  14. from https://stackoverflow.com/questions/328/php-session-security by cc-by-sa and MIT lisence