Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP setcookie "SameSite=Strict"?

I recently read "RFC 6265" on the attribute "Same Site", I looked at some articles that talked about that in April 2016, "same-site" attribute has been implemented for Chrome 51 and Opera 39 ...

I wonder if current PHP supports creating cookies with this attribute?

Reference:

  • Feature documentation on Chrome’s chromestatus.com
  • HTTPbis draft first adopted by Chrome
  • Latest HTTPbis draft
like image 543
Lauro Moraes Avatar asked Sep 28 '16 14:09

Lauro Moraes


People also ask

How do I set strict on SameSite?

To prepare, Android allows native apps to set cookies directly through the CookieManager API. You must declare first party cookies as SameSite=Lax or SameSite=Strict , as appropriate. You must declare third party cookies as SameSite=None; Secure .

How do you set the SameSite attribute of cookies to LAX strict in PHP?

You can change the Lax value to Strict for Strict cookies. For explicit SameSite=None session cookies, the PHP setting should be used with quotes. This is because in INI, none is interpreted as false . It is up to browsers to assume a default value.

Should I use SameSite lax or strict?

The SameSite=Strict value will only allow first party cookies to be sent. This setting is good for user actions like login credentials, but the cookie will not be sent on the initial request to the webpage. The SameSite=Lax setting will allow the user to maintain a logged in status while arriving from an external link.

How do you specify SameSite none and secure?

To test the effect of the new Chrome behavior on your site or cookies you manage, you can go to chrome://flags in Chrome 76+ and enable the "SameSite by default cookies" and "Cookies without SameSite must be secure" experiments.


1 Answers

1. For PHP >= v7.3

You can use the $options array to set the samesite value, for example:

setcookie($name, $value, [     'expires' => time() + 86400,     'path' => '/',     'domain' => 'domain.com',     'secure' => true,     'httponly' => true,     'samesite' => 'None', ]); 

The value of the samesite element should be either None, Lax or Strict.

Read more in the manual page.

2. For PHP < v7.3

You can use one of the following solutions/workarounds depending on your codebase/needs

2.1 Setting SameSite cookies using Apache configuration

You can add the following line to your Apache configuration

Header always edit Set-Cookie (.*) "$1; SameSite=Lax" 

and this will update all your cookies with SameSite=Lax flag

See more here: https://blog.giantgeek.com/?p=1872

2.2 Setting SameSite cookies using Nginx configuration

location / {     # your usual config ...     # hack, set all cookies to secure, httponly and samesite (strict or lax)     proxy_cookie_path / "/; secure; HttpOnly; SameSite=strict"; } 

Same here, this also will update all your cookies with SameSite=Lax flag

See more here: https://serverfault.com/questions/849888/add-samesite-to-cookies-using-nginx-as-reverse-proxy

2.3 Setting SameSite cookies using header method

As we know cookies are just a header in HTTP request with the following structure

Set-Cookie: key=value; path=/; domain=example.org; HttpOnly; SameSite=Lax 

so we can just set the cookies with header method

header("Set-Cookie: key=value; path=/; domain=example.org; HttpOnly; SameSite=Lax"); 

In fact, Symfony is not waiting for PHP 7.3 and already doing it under the hood, see here

📝You can use same in Laravel too because Laravel under the hood using Symfony's Symfony\Component\HttpFoundation\Cookie class

2.4 Setting SameSite cookies using a bug in setcookie method

setcookie('cookie-name', '1', 0, '/; samesite=strict'); 

Be careful with this one, it's a known bug in PHP setcookie method and already resolved in PHP7.3 version, see here - https://github.com/php/php-src/commit/5cb825df7251aeb28b297f071c35b227a3949f01

like image 115
Marty Aghajanyan Avatar answered Oct 13 '22 04:10

Marty Aghajanyan