17
votes

Comment dire à PHP d'utiliser SameSite = None pour les cookies intersites?

Selon l'article ici https://php.watch/articles/PHP-Samesite-cookies et la documentation PHP sur https://www.php.net/manual/en/session.security.ini.php , il n'y en a que 2 options de configuration possibles pour cette nouvelle fonctionnalité, ajoutée dans PHP 7.3:

  1. session.cookie_samesite = Lax
  2. session.cookie_samesite = Strict

Pourtant, selon la console Chrome, cela doit être défini sur "Aucun":

Un cookie associé à une ressource SameSite à l'URL a été défini sans l'attribut SameSite . Il a été bloqué, car Chrome ne délivre désormais des cookies avec des demandes SameSite=None que s'ils sont définis avec SameSite=None et Secure . Vous pouvez consulter les cookies dans les outils de développement sous Application> Stockage> Cookies et voir plus de détails sur URL et URL.

Pour cette raison, je ne peux plus définir de cookies intersites. Quelle est la solution de contournement?


1 commentaires

vous pouvez vérifier ici avec l'en-tête php. stackoverflow.com/a/63481019/6128573


6 Réponses :


25
votes

Vous pouvez définir la valeur sur "Aucun" en utilisant ini_set . Il n'y a pas de vérification que la valeur est prise en charge lorsque cette fonction est utilisée:

session_set_cookie_params(['samesite' => 'None']);
session_start();

session_set_cookie_params peut également le définir:

ini_set('session.cookie_samesite', 'None');
session_start();

Le rapport de bogue pour que cela soit pris en charge dans php.ini est ici .


Comme @shrimpwagon l'a dit dans un commentaire ci - dessous , session.cookie_secure doit être true pour que cela fonctionne. PHP n'en a pas besoin, mais les navigateurs le font.


5 commentaires

Merci - J'ai pu utiliser le code suivant pour me débarrasser du message Chrome et permettre aux cookies intersites de continuer à fonctionner: session_set_cookie_params (['samesite' => 'None', 'secure' => true]);


attention, samesite = none n'est pas pris en charge dans les anciens navigateurs et rejettera complètement le cookie. vérifiez ceci et assurez-vous d'exclure les anciens navigateurs lorsque vous définissez un attribut de même site sur votre cookie de session:chromium.org/updates/same-site/incompatible-clients


La configuration de session.cookie_samesite = None dans le php.ini n'a PAS fonctionné en PHP 7.3.15. L'utilisation de session_set_cookie_params comme décrit ci-dessus a fonctionné.


Légèrement incorrect. session_set_cookie_params(['SameSite' => 'None', 'Secure' => true]); être: session_set_cookie_params(['SameSite' => 'None', 'Secure' => true]);


@shrimpwagon Mis à jour



0
votes

Cette méthode peut être utile pour vous

Ajoutez les attributs d'en-tête sur nginx sous Secure + SameSite=None

emplacement / {

proxy_cookie_path / "/; secure; SameSite = none";

}

Ça marche sur moi!


0 commentaires

1
votes

Mal:

session.cookie_samesite="None"

Correct:

session.cookie_samesite=None

Explication ici


1 commentaires

Ne fais pas ça. Certains navigateurs sont buggés et rejetteront complètement les cookies avec SameSite = None. Vous devez d'abord renifler le UserAgent.Voici une explication de Google .



0
votes

J'utilise cakephp 1.3. J'ai besoin d'un cookie backend au front-end qui n'est pas le même domaine. vérifiez en détail ici.

https://stackoverflow.com/a/63481019/6128573


0 commentaires

1
votes

ini_set('session.cookie_secure', "1"); ini_set('session.cookie_httponly', "1"); ini_set('session.cookie_samesite','None'); session_start();

php 7.4 même site dans phpinfo entrez la description de l'image ici

php 7.2 samesite n'existe pas dans phpinfo entrez la description de l'image ici

$currentCookieParams = session_get_cookie_params();
$cookie_domain= 'your domain';
if (PHP_VERSION_ID >= 70300) {
session_set_cookie_params([
    'lifetime' =>  $currentCookieParams["lifetime"],
    'path' => '/',
    'domain' => $cookie_domain,
    'secure' => "1",
    'httponly' => "1",
    'samesite' => 'None',
]);
} else {
session_set_cookie_params(
    $currentCookieParams["lifetime"],
    '/; samesite=None',
    $cookie_domain,
    "1",
    "1"
);
}
session_start();

Ù… ÙˆÙ Ù ‚باشید


0 commentaires

0
votes

Pour PHP 5.6.40, il existe une solution de contournement (le paramètre hack on path) qui n'implique pas la reconstruction de PHP.

Si vous n'avez aucun problème à reconstruire le binaire PHP, j'ai réussi à porter cette fonctionnalité de PHP 7.3 à PHP 5.6.40, et il y a maintenant une pull request. J'en avais besoin pour nos projets qui n'ont pas encore migré. Je sais que la branche 5.6 est obsolète, je ne fais que partager.

Demande d'extraction: https://github.com/php/php-src/pull/6446

Notre repo avec les modifications: https://github.com/Inducido/php-src/tree/PHP-5.6.40

Build testé sur Debian 8.11

Nouvelle fonctionnalité

Session: . Ajout de la prise en charge de la directive de cookie SameSite pour setcookie (), setrawcookie () et session_set_cookie_params (). Port de la branche PHP 7.x, ils ont tous un paramètre supplémentaire "samesite" à la toute fin (chaîne)

prototypes:

bool setcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly[, string samesite]]]]]]])
bool setrawcookie(string name [, string value [, int expires [, string path [, string domain [, bool secure[, bool httponly[, string samesite]]]]]]])
void session_set_cookie_params(int lifetime [, string path [, string domain [, bool secure[, bool httponly[, string samesite]]]]])
(session_get_cookie_params updated too)

Modifications de la gestion des fichiers INI

  • session.cookie_samesite. Nouvelle option INI pour permettre de définir la directive SameSite pour les cookies. La valeur par défaut est "" (chaîne vide), donc aucune directive SameSite n'est définie. Peut être réglé sur "Lax" ou "Strict", ou "None" qui définit la directive SameSite respective. lorsque vous utilisez "Aucun", assurez-vous d'inclure les guillemets, car none n'est interprété comme false dans les fichiers ini.

Cela résout le problème "Ce cookie défini a été bloqué en raison des préférences de l'utilisateur" dans Chrome.


0 commentaires