수색…


통사론

  • void session_abort (void)
  • int session_cache_expire ([string $ new_cache_expire])
  • void session_commit (void)
  • string session_create_id ([string $ prefix])
  • bool session_decode (string $ data)
  • bool session_destroy (void)
  • 문자열 session_encode (void)
  • int session_gc (void)
  • 배열 session_get_cookie_params (void)
  • string session_id ([string $ id])
  • bool session_is_registered (string $ name)
  • string session_module_name ([string $ module])
  • 문자열 session_name ([문자열 $ 이름])
  • bool session_regenerate_id ([bool $ delete_old_session = false])
  • void session_register_shutdown (void)
  • bool session_register (mixed $ name [, mixed $ ...])
  • void session_reset (void)
  • string session_save_path ([string $ path])
  • void session_set_cookie_params (int $ lifetime [, string $ path [, string $ 도메인 [, bool $ secure = false [, bool $ httponly = false]]]])
  • bool session_set_save_handler (호출 가능 $ open, 호출 가능 $ 닫기, 호출 가능 $ 읽기, 호출 가능 $ 쓰기, 호출 가능 $ destroy, 호출 가능 $ gc [, 호출 가능 $ create_sid [, 호출 가능 $ validate_sid [, 호출 가능 $ update_timestamp]])
  • bool session_start ([array $ options = []])
  • int session_status (void)
  • bool session_unregister (문자열 $ name)
  • void session_unset (void)
  • void session_write_close (void)

비고

세션이 이미 시작된 경우에도 session_start() 를 호출하면 PHP 경고가 발생합니다.

세션 데이터 조작

$_SESSION 변수는 배열이며 일반 배열처럼 검색하거나 조작 할 수 있습니다.

<?php
// Starting the session
session_start();

// Storing the value in session
$_SESSION['id'] = 342;

// conditional usage of session values that may have been set in a previous session
if(!isset($_SESSION["login"])) {
    echo "Please login first";
    exit;
}
// now you can use the login safely
$user = $_SESSION["login"];

// Getting a value from the session data, or with default value, 
//     using the Null Coalescing operator in PHP 7
$name = $_SESSION['name'] ?? 'Anonymous';

또한 배열 작업 방법에 대한 자세한 내용 은 배열 조작을 참조하십시오.

세션에 객체를 저장하면 클래스 자동 로더가 있거나 클래스를 이미로드 한 경우에만 객체를 정상적으로 검색 할 수 있습니다. 그렇지 않으면 개체가 __PHP_Incomplete_Class 유형으로 __PHP_Incomplete_Class 나중에 충돌 이 발생할 수 있습니다. 자동 로딩 에 대한 네임 스페이스 및 자동 로딩을 참조하십시오.

경고:

세션 데이터가 도용 될 수 있습니다. Pro PHP 보안 : 응용 프로그램 보안 원칙에서 XSS 방어 구현 - 7 장 : 세션 하이재킹 방지 $_SESSION 개인 정보를 절대 저장하지 않는 것이 좋습니다. 여기에는 신용 카드 번호 , 정부 발급 신분증암호가 포함됩니다 . 해커가 합법적 인 사용자를 가장하거나 침해 할 수있는 이름 , 전자 메일 , 전화 번호 등의 데이터를 거의 가정하지 않을 수도 있습니다. 일반적으로 세션 데이터에서 숫자 식별자와 같은 가치가 없거나 개인이 아닌 값을 사용하십시오.

전체 세션 삭제

파괴하려는 세션이 있다면 session_destroy() 하여이를 수행 할 수 있습니다.

/*
    Let us assume that our session looks like this:
    Array([firstname] => Jon, [id] => 123)

    We first need to start our session:
*/
session_start();

/*
    We can now remove all the values from the `SESSION` superglobal:
    If you omitted this step all of the global variables stored in the 
    superglobal would still exist even though the session had been destroyed.
*/
$_SESSION = array();

// If it's desired to kill the session, also delete the session cookie.
// Note: This will destroy the session, and not just the session data!
if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
    );
}

//Finally we can destroy the session:
session_destroy();

session_destroy() 를 사용하는 것은 $_SESSION = array(); SESSION superglobal에 저장된 모든 값이 제거되지만 SESSION 의 실제 저장된 버전은 삭제되지 않습니다.


참고 : $_SESSION = array(); 매뉴얼에 다음과 같이 명시되어 있기 때문에 session_unset() 대신

session_unset ()은 $ _SESSION을 사용하지 않는 오래된 사용되지 않는 코드에만 사용하십시오.

session_start () 옵션

PHP 세션부터는 세션 기반 php.ini 옵션 을 가진 배열을 session_start 함수에 전달할 수 있습니다.

<?php
   if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
       // php >= 7 version
       session_start([
          'cache_limiter' => 'private',
          'read_and_close' => true,
       ]);
   } else {
       // php < 7 version
       session_start();
   }
?>

또한이 기능은 session.lazy_write 라는 새로운 php.ini 설정을 도입합니다. 기본값은 true 이고 세션 데이터가 변경된 경우에만 세션 데이터가 다시 작성된다는 의미입니다.

참조 : https://wiki.php.net/rfc/session-lock-ini

세션 이름

세션 쿠키가 생성되었는지 확인하기

세션 이름은 세션을 저장하는 데 사용되는 쿠키의 이름입니다. 이 기능을 사용하여 세션의 쿠키가 사용자에게 생성되었는지 검색 할 수 있습니다.

if(isset($_COOKIE[session_name()])) {
    session_start();
}

쿠키를 불필요하게 만들지 않는 한이 방법은 일반적으로 유용하지 않습니다.

세션 이름 변경 중

session_name() 을 호출하여 세션 이름을 업데이트 할 수 있습니다.

//Set the session name
session_name('newname');
//Start the session
session_start();

session_name() 인수가 제공되지 않으면 현재 세션 이름이 반환됩니다.

영숫자 만 포함해야합니다. 그것은 짧고 서술 적이어야합니다 (즉, 쿠키 경고가 활성화 된 사용자의 경우). 세션 이름은 숫자로만 구성 될 수 없으며 적어도 하나의 문자가 있어야합니다. 그렇지 않으면 매번 새로운 세션 ID가 생성됩니다.

세션 잠금

PHP는 세션 데이터를 서버 측의 파일에 씁니다. session_start() 를 통해 세션을 시작하는 PHP 스크립트에 대한 요청이있을 때, PHP는이 세션 파일을 잠궈서 동일한 session_id 에 대한 다른 들어오는 요청을 차단 / 대기하게하므로 다른 요청은 session_start() 에서 session_start() 때까지 session_start() 또는 잠긴 세션 파일 이 해제되지 않은 경우

스크립트가 완료되거나 세션이 수동으로 닫힐 때까지 세션 파일은 잠긴 상태로 유지됩니다. 이 상황을 피하기 위해 여러 개의 요청이 차단되는 것을 방지하기 위해 세션을 시작하고 세션 파일을 잠그고 나머지 요청을 계속할 수있는 세션을 닫을 수 있습니다.

// php < 7.0 
// start session 
session_start();

// write data to session
$_SESSION['id'] = 123; // session file is locked, so other requests are blocked

// close the session, release lock
session_write_close();

이제는 세션이 닫히면 세션 값을 읽는 방법, 세션이 닫힌 후에도 아름답게 보이고 세션은 계속 사용할 수 있다고 생각할 것입니다. 따라서 세션 데이터를 읽을 수 있습니다.

echo $_SESSION['id'];    // will output  123

php> = 7.0 에서는 session_write_close() 를 사용하지 않아도되기 때문에 read_only session, read_write session 및 lazy_write 세션을 가질 수 있습니다.

오류없이 안전한 세션 시작

많은 개발자들이 거대한 프로젝트에서 작업 할 때 특히 플러그인, 애드온, 컴포넌트 등의 일부 모듈 식 CMS에서 작동하는 경우이 문제가 발생합니다. 안전한 세션 시작을위한 솔루션입니다. 먼저 모든 버전을 다루는 PHP 버전을 확인한 후 다음 버전을 확인합니다 세션이 시작된 경우. 세션이 존재하지 않으면 세션 안전을 시작합니다. 세션이 존재하지 않으면 아무 일도 일어나지 않습니다.

if (version_compare(PHP_VERSION, '7.0.0') >= 0) {
    if(session_status() == PHP_SESSION_NONE) {
        session_start(array(
          'cache_limiter' => 'private',
          'read_and_close' => true,
       ));
    }
}
else if (version_compare(PHP_VERSION, '5.4.0') >= 0)
{
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
}
else
{
    if(session_id() == '') {
        session_start();
    }
}

이렇게하면 session_start 오류를 피할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow