수색…
통사론
- 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
오류를 피할 수 있습니다.