状況
- CDNとしてCloudflareを使用しているサイトがある。
- そのサイトにログインし、Cookieによるセッションが確立している。
- Firefoxの[ウェブ開発]で[cURLとしてコピー]をする。
- コンソールでcurlを実行する。
問題とする現象
- curlではCookieのセッション情報が無視されてHTTP403が発生する。
現象について補足1
- Firefoxからのコピペなので当然だが、curlにはCookieにセッション情報も付与されている。
- 実際はPHPSESSID(PHPのデフォルトで使用されるやつ)だった。
- ブラウザではセッションは確立しており、ページ遷移しても維持できている。
- 勘だがHTTP403はCloudflareが出しているように見える。
対策
- curlにオプション–ciphers ECDHE+AESGCMを使用する
今は開発停止したが、Cloudfrareに接続するOSSのコードに”Removes problematic ciphers which cause the captcha page to show up”なる記述があった。
https://github.com/KyranRana/cloudflare-bypass/blob/master/src/main/CFCurlImpl.php
これを参考にした。
現象について補足2
- curl 7.64.1 (x86_64-apple-darwin19.0) libcurl/7.64.1 (SecureTransport) LibreSSL/2.8.3 zlib/1.2.11 nghttp2/1.39.2
- NGだったcurlのTLS接続: SSL connection using TLSv1.2 / ECDHE-ECDSA-CHACHA20-POLY1305
- OKだったcurlのTLS接続: SSL connection using TLSv1.2 / ECDHE-ECDSA-AES128-GCM-SHA256
- FirefoxのTLS接続: TLSv1.3 / TLS-AES-128-GCM-SHA256
- Cloudfreには”_cflb”というCookieのキーで”セッションアフィニティ”なるセッションの維持機能があるらしいが、それは使用されていなかった。
- Cookieにるログインセッションの維持期間は年単位だった。
curlのTLS接続の確認は–verboseオプションを使用した。
そもそもCDNを使用しているサイトにcurlを使うことがこれまでなく、本当に偶然だったのでhttpでの接続だったらどうなるとかの検証はできていない。
TLSの再接続がCookieのログインセッションをリセットしているのかと思ったが、Cookieにるログインセッションの維持期間(expires)はまったく異なっていたので、これが意図した挙動であるとは思えない。