CakePHP 2.3에서 samesite 쿠키 속성을 어떻게 설정할 수 있습니까?

Nov 17 2020

CakePHP 2.3은 core.php 파일에 세션 변수 (쿠키 속성 포함)를 설정합니다. 나는 설정해야합니다 samesite=NoneSecure=true세션 쿠키,하지만 구성에서 사용할 수있는 설정, 쇼에만 다음과 같은 옵션이 표시되지 않습니다 :

  • Session.cookie-사용할 쿠키의 이름입니다. 기본값은 'CAKEPHP'입니다.
  • Session.timeout-세션을 유지하려는 시간 (분). 이 시간 제한은 CakePHP에서 처리합니다.
  • Session.cookieTimeout -세션 쿠키가 유지되는 시간 (분)입니다.
  • Session.checkAgent-세션을 시작할 때 사용자 에이전트를 확인 하시겠습니까? 이전 버전의 IE, Chrome 프레임 또는 특정 웹 브라우징 장치 및 AJAX를 처리 할 때 값을 false로 설정할 수 있습니다.
  • Session.defaults-세션의 기반으로 사용할 기본 구성 세트입니다. 네 가지 내장 기능이 있습니다 : php, cake, cache, database.
  • Session.handler-사용자 지정 세션 처리기를 활성화하는 데 사용할 수 있습니다. 와 함께 사용할 수있는 콜 러블 배열이 필요 session_save_handler합니다. 이 옵션을 사용 session.save_handler하면 ini 배열에 자동으로 추가 됩니다.
  • Session.autoRegenerate-이 설정을 활성화하면 세션 및 자주 변경되는 세션 ID의 자동 갱신을 켭니다. CakeSession :: $ requestCountdown을 참조하십시오.
  • Session.ini -설정할 추가 ini 값의 연관 배열입니다.

이것이 내가 지금 가지고있는 방법입니다.

Configure::write('Session', array(
                                    'defaults' => 'database',
                                    'handler' => array('model' => 'cake_sessions'),
                                    'timeout' => 60
                                    ));

이에 대한 해결 방법이 있습니까? 나는 PHP로 이것을 수행하는 방법을 찾고 있었지만 CakePHP가 내가 원하는 속성으로 생성하는 세션 쿠키를 어떻게 편집할지 또는 쿠키가 생성되면 가능한지 확실하지 않습니다.

답변

ndm Nov 18 2020 at 09:55

PHP 7.3 이전

PHP 7.3 이전의 PHP 버전에서는 SameSite단순히 세미콜론으로 경로를 닫아 경로에 추가 쿠키 속성을 추가하는 쿠키 경로 해킹을 활용 하여 속성을 삽입 할 수 있습니다 .

이에 따라 session.cookie_pathini 옵션을 구성하기 만하면 app/Config/core.php됩니다. 예를 들어 애플리케이션의 기본 경로가 /다음 과 같은 경우 다음과 같습니다 .

Configure::write('Session', [
    'defaults' => 'php',
    'ini' => [
        'session.cookie_path' => '/; SameSite=None',
    ],
]);

Secure속성 (즉, session.cookie_secure당신이를 통해 사이트를 방문 할 때 INI 옵션) 자동으로 CakePHP를 구성 할 것입니다 https.

PHP 7.3부터

PHP 7.3 이후의 PHP 버전에서는 session.cookie_samesite대신 ini 옵션을 사용합니다.

Configure::write('Session', [
    'defaults' => 'php',
    'ini' => [
        'session.cookie_samesite' => 'None',
    ],
]);

기타 쿠키

물론이 모든 것은 세션 쿠키에만 적용됩니다 . 쿠키 구성 요소 를 통해 추가 쿠키를 사용하는 경우 $path그에 따라 속성 을 수정하여 경로 해킹을 활용해야 하며 세션과는 달리 보안 쿠키를 명시 적으로 활성화해야합니다.

$this->Cookie->path = '/; SameSite=None';
$this->Cookie->secure = true;

PHP로 7.3+ 사용자 지정 / 확장 쿠키 구성 요소 및 확장 / 사용자 정의 사용해야 할 것 응답 클래스 당신은을 무시할 것 CookieComponent::_write(), CakeResponse::cookie()그리고 CakeResponse::_setCookies()그렇게 구성 요소가 동일한 사이트에 대한 옵션을 설정할 수 있습니다 것으로, 이에 따라 방법을하고, 응답이이를 setcookie()호출로 전달합니다 .

예:

<?php
// in app/Controller/Component/AppCookieComponent.php

App::uses('CookieComponent', 'Controller/Component');

class AppCookieComponent extends CookieComponent
{
    public $sameSite = 'Lax';

    protected function _write($name, $value)
    {
        $this->_response->cookie(array( 'name' => $this->name . $name, 'value' => $this->_encrypt($value), 'expire' => $this->_expires,
            'path' => $this->path, 'domain' => $this->domain,
            'secure' => $this->secure, 'httpOnly' => $this->httpOnly,
            'sameSite' => $this->sameSite, )); if (!empty($this->_reset)) {
            $this->_expires = $this->_reset;
            $this->_reset = null;
        }
    }
}
  • https://github.com/cakephp/cakephp/blob/2.3.10/lib/Cake/Controller/Component/CookieComponent.php#L413
  • https://github.com/cakephp/cakephp/blob/2.10.22/lib/Cake/Controller/Component/CookieComponent.php#L393
<?php
// in app/Network/AppResponse.php

App::uses('CakeResponse', 'Network');

class AppResponse extends CakeResponse
{
    public function cookie($options = null)
    {
        $options += [ 'sameSite' => 'Lax', ]; return parent::cookie($options);
    }

    protected function _setCookies()
    {
        foreach ($this->_cookies as $name => $cookie) { $options = [
                'expires' => $cookie['expire'], 'path' => $cookie['path'],
                'domain' => $cookie['domain'], 'secure' => $cookie['secure'],
                'httponly' => $cookie['httpOnly'], 'samesite' => $cookie['sameSite'],
            ];
            setcookie($name, $cookie['value'], $options);
        }
    }
}
  • https://github.com/cakephp/cakephp/blob/2.3.10/lib/Cake/Network/CakeResponse.php#L1189
  • https://github.com/cakephp/cakephp/blob/2.3.10/lib/Cake/Network/CakeResponse.php#L437
  • https://github.com/cakephp/cakephp/blob/2.10.22/lib/Cake/Network/CakeResponse.php#L1236
  • https://github.com/cakephp/cakephp/blob/2.10.22/lib/Cake/Network/CakeResponse.php#L454

전면 컨트롤러에 사용자 지정 응답을 삽입합니다.

// in app/webroot/index.php

App::uses('Network', 'AppResponse');

$Dispatcher = new Dispatcher();
$Dispatcher->dispatch(
    new CakeRequest(),
    new AppResponse()
);
  • https://github.com/cakephp/cakephp/blob/2.3.10/app/webroot/index.php#L107-L110
  • https://github.com/cakephp/cakephp/blob/2.10.22/app/webroot/index.php#L114-L118

Cookie사용자 컴포넌트 클래스로 컴포넌트 별칭을 지정합니다.

// in app/Controller/AppController.php

public $components = [
    'Cookie' => [
        'className' => 'AppCookie',
    ],
];

그런 다음 사용하기 전에 구성 요소를 적절하게 구성하십시오.

$this->Cookie->sameSite = 'None'; $this->Cookie->secure = true;

또는 응답 개체를 직접 사용하여 쿠키를 설정하십시오.

$this->response->cookie([
    'name' => 'cookie name',
    'value' => 'cookie value',
    'expire' => time() + (60 * 24),
    'path' => '/',
    'domain' => '',
    'secure' => true,
    'httpOnly' => false,
    'sameSite' => 'None',
]);