WordPressでajaxに絡んで自前のcookieにsamesite属性を設定する

cookie

調べて出てきた情報ではどれも実装できず、色々試してどうにかしたのでメモとして。

できない理由とできた理由が明確にはわからないので、あまり参考にしないほうが良いかもしれません。

構築環境
WordPress5.3.2
PHP 7.3.14

実現したいこと

  • WordPressでボタンを押すとajaxで動作させ、その際にcookieを保存する
  • cookieにはsamesite属性をつける
  • PHP7.3以上(setcookieoptionsを使うため)

当サイトページの下部にも付いていますが、自前の投票ボタンの連投防止にcookieを使っているため、これにsamesite属性をつけるのが目的でした。

setcookieoptionsに関しては以下参照のこと。

なお、サイトが表示されたタイミングでcookieをセットする場合は当記事末尾を参照ください。

サンプル

先に動作したサンプルを記載します。


setcookie('cookie-name', 'cookie-value', [
 'expires' => time()+3600,
 'path' => '/',
 'secure' => true,
 'samesite' => 'strict'
]);

上記にはWPのフックはなく、ボタンを押したタイミングでの実行時に動作したものです。

具体的には、$name$value以外を配列にまとめれば動いた、となります。

起きた問題

調べても理由がわかっていないのですが、状況は以下のようなものでした。


// フック使用せず、functions.phpではないPHPファイルに記載する場合
// 動作する
setCookie('cookie-name', 'cookie-value');
setCookie('cookie-name', 'cookie-value', time()+3600);
setCookie('cookie-name', 'cookie-value', time()+3600, '/');
setCookie('cookie-name', 'cookie-value', time()+3600, '/', true);
setCookie('cookie-name', 'cookie-value', time()+3600, '/', true, false);
// 動作しない
setCookie('cookie-name', 'cookie-value', time()+3600, ['samesite' => 'strict']);
setCookie('cookie-name', 'cookie-value', time()+3600, '/', true, false, ['samesite' => 'strict']);
setCookie('cookie-name', 'cookie-value', time()+3600, '/; samesite=strict');
  • optionsに含めることができるpathなどがoptions外に設定されている場合、optionssamesiteを書いても動作しない

php.netでは以下のように書かれていてoptionsの記述と排他的であるとは思えない状況ではあります。

options
expires, path, domain, secure, httponly および samesite のうちから、任意のキーを設定可能な連想配列(array)です。 値については、キーと同じ名前のパラメーターで説明した意味と同じです。 samesite 要素の値は、 None, Lax または Strict です。 上記で許されているオプションのうち、与えられなかったものについては、 デフォルト値は明示的にパラメータを与えた場合のデフォルト値と同じです。 samesite 要素が省略された場合は、SameSite クッキー属性は設定されません。

サーバーの設定なのか、WordPress特有の何かなのか、こちらの勘違いや確認間違いなのか…。

pathに記載する書き方


setcookie('cookie-name', 'cookie-value', time()+3600, '/; SameSite=Strict', '', true, false);

検索では上記のようなpathsamesiteを記述する方法を見かけますが、PHP7.3以上ではやめたほうがよいのではと思います。詳細は以下がわかりやすいです。

ちなみに今回の調査時に一応試しましたが動きませんでした。

JS側でcookieをセットする

当記事と同じajaxという条件で、かつJS側でのCookie実装であれば上記記事が参考になるかもしれません。

サイトが表示されたタイミングでcookieを設定する


add_action( 'init', 'my_set_cookie', 1 );
function my_set_cookie() {
 setcookie('cookie-name', 'cookie-value', [
  'expires' => time()+3600,
  'path' => '/',
  'secure' => true,
  'samesite' => 'strict'
 ]);
}

単にサイトが表示されたタイミングでcookieを設定するだけなら、上記のような感じでfunctions.phpに記載すれば動作します。

使用するフックで最適なものがわからなかったのですが、init以外でも使用自体は可能です。

または、functions.phpに書くのであれば以下のようにfookなしでもセットは可能でした。


setcookie('cookie-name', 'cookie-value', [
 'expires' => time()+3600,
 'path' => '/',
 'secure' => true,
 'samesite' => 'strict'
]);

結び

総当たりで試して動く書き方を見つけた感じなので、裏付けが非常に薄い状態です。
単に「samesite属性を使う場合は、全てoptionsに配列で記載する」というルールがあるだけなのかもしれませんが。

何かわかったら追記したいと思います。

0人がこの記事を評価

役に立ったよという方は上の「記事を評価する」ボタンをクリックしてもらえると嬉しいです。

連投防止のためにCookie使用。SNSへの投稿など他サービスとの連動は一切ありません。

コメント欄