お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。

HTTPヘッダを持たないHTTPリクエストはあり得るのか?というのを検証しているときに気づいた話。

RFC 7230ではHostヘッダを持たないHTTPリクエストは禁止されており、これを受けたサーバーは400応答を返すことを必須としている。

RFC 7230:Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and RoutingHostより

A client MUST send a Host header field in an HTTP/1.1 request even if
the request-target is in the absolute-form, since this allows the
Host information to be forwarded through ancient HTTP/1.0 proxies
that might not have implemented Host.
A server MUST respond with a 400 (Bad Request) status code to any
HTTP/1.1 request message that lacks a Host header field and to any
request message that contains more than one Host header field or a
Host header field with an invalid field-value.

なお、Node.jsのHTTPサーバー機能ではHostヘッダーのない要求を受け入れることができる。

http.createServer([options][, requestListener])を見ると、以下のようにrequireHostHeader: falseを渡すことで実現可能だ。規定値はtrueであるため、基本的にはHostヘッダーなしの要求は400応答が返される。

import http from 'node:http';

http
  .createServer({requireHostHeader: false}, (req, res) => {
    console.log(req.headers);
    res.statusCode = 200;
    res.end();
  })
  .listen(3000);

nginxにおいてもHostヘッダーなしの要求は以下の応答が返されたため同様と思われる。

<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.26.0</center>
</body>
</html>

但し、nginxにおいてHostなしの要求を許容する方法は見つからなかった。Server namesによるとserver_name "";とすることで出来そうに見えたが、これは機能させることができず、400応答が返された。

mkcertで作ったCA証明書をエクスポートする方法でエクスポートしたCA証明書を他の端末に取り込む方法

Android

確認環境

Galaxy S22 Ultra Android 14

手順

  1. Android端末のストレージにエクスポートしたCA証明書を持ってくる
  2. 設定>セキュリティ>その他のセキュリティ設定>ストレージからインストール>CA証明書>このままインストール
  3. 内部ストレージからエクスポートしたCA証明書を選択

Windows

確認環境

Windows 11 Pro (22621.3155)

手順

  1. スタートメニューやコンパネから「ユーザー証明書の管理」を開く
  2. 信頼されたルート証明書を右クリックし、すべてのタスク>インポート
    信頼されたルート証明書を右クリックし、すべてのタスク>インポート
  3. エクスポートしたCA証明書を参照する
    エクスポートしたCA証明書を参照する
  4. 証明書ストアが「信頼されたルート証明機関」になっていることを確認する
    証明書ストアが「信頼されたルート証明機関」になっていることを確認する
  5. 取り込む証明書が正しいことを確認して「はい」
    取り込む証明書が正しいことを確認して「はい」

Ubuntu

確認環境

Ubuntu 22.04.3 LTS

手順

$CER_FILE="エクスポートしたCA証明書"
sudo openssl x509 -inform der -outform pem -in $CER_FILE -out PEM.crt
sudo cp PEM.crt /usr/local/share/ca-certificates
sudo update-ca-certificates

別の端末に持っていきたいときに使える

確認環境

Env Ver
Windows 11 Pro 22621.3155

手順

  1. ユーザー証明書の管理を開く
  2. 信頼されたルート証明機関>証明書
  3. mkcertで始まる証明書を探す
  4. 右クリック>すべてのタスク>エクスポート
  5. DER encoded binary X.509 (.CER)
  6. 適当なファイル名を付けてエクスポート
投稿日:
技術::DNS技術::メール技術::セキュリティ

ここ最近なりすましメールが目立つのでなりすましメール防御対策を取りましょうという話。

なりすましメールが増えている一例

ここ数日の間にイラストレーターのIxy先生やMastodonインスタンス管理人のにょき氏といった一定の知名度を持つ人物を中心になりすましメールの被害にあっているようだ。

ここまで目立つのは余り見聞きしなかったので恐らくここ昨今のGMailとかの騒動を見たところで、なりすましメールを作れることに気づいた人物が愉快犯的に行為をしているのだろう。

取りうる防御策

個人レベルでできる対策としてはDNSレコードやメールサーバーの設定にSPF, DKIM, DMARCを設定することだ。これらの内容についてはGoogleによるDMARC を使用してなりすましと迷惑メールを防止するが詳しい。

さくらのレンタルサーバーを利用している場合は以下が参考になる。

さくらのレンタルサーバーを利用して外部DNSを利用している場合は、私が以前書いたValue-DomainのドメインをさくらのレンタルサーバーのメールでSPF, DKIM, DMARC対応させるが参考になるだろう。

SPD, DKIM, DMARCの三点を設定することで相手のメールサーバーがこれらに対応している場合になりすましメールを迷惑メールとして分類したり、メールの受信を拒否できるとされているため、設定することでなりすましメールを防御できる可能性が高まる。

メール送信に使っていないドメインに関しても以下のようなDMARCを設定しておくことで、悪意のある第三者によるなりすましを防げるだろう。

txt _dmarc v=DMARC1; p=reject; aspf=r; adkim=r

またメールサーバーを運用されている各位におかれては、SPD, DKIM, DMARCの三点を識別し、適切に受信メールをフィルタリングできる仕組みを導入して頂けると犯罪予告や迷惑メールによる被害を減らせる可能性があるので、是非とも導入を検討いただきたい。

投稿日:
技術::セキュリティ

前職で古いWebシステムのマイグレーションしてた時に思ったのだが、SameSite CookieがあればCSRF Tokenは最早いらないのではないか?というのに気が付いたので調べてみた話。

結論として言うとEdgeではPOSTリクエストでCookieが飛ぶ事はないので、CSRF Tokenを考慮する必要はなさそうに思える。

理由としてはCookieでSameSite=strictを指定している場合、クロスドメインでのCookie送信がブロックされるという話が事実であればCSRF Tokenは不要であるはずだからだ。

これによって悪意のあるサイトからAjaxやリダイレクト、フォームなどを使った攻撃をした場合にサーバーにCookieが送信されなくなる筈なので、理論上は問題なくなる。

以下では実際にCookieが送信されるかどうかの動きを見てみた。確認環境はMicrosoft Edge 121.0.2277.83。方式のリンクはシーケンス図になっている。

シーケンス図に書いてあるSameSite={var}{var}にはstrictlaxが入る。確認内容としてはシーケンスの一番最後のHTTPリクエストでCookieが送信されているかどうかを見ている。noneは面倒なので見ていない。

方式 SameSite=strict SameSite=lax
HTTP 302 REDIRECT 送信される 送信される
アンカーリンクのクリック 送信されない 送信される
アンカーリンクのクリック→HTTP 302 REDIRECT 送信されない 送信される
location.hrefでの移動 送信されない 送信される
location.hrefでの移動 →HTTP 302 REDIRECT 送信されない 送信される
FORMタグのsubmit(GET) 送信されない 送信される
FORMタグのsubmit(POST) 送信されない 送信されない

SameSite=strictだと外部サイトから開いたときにCookieが送信されないため、Google検索などから流入された時のログイン状態に不都合が出ると思われるので、その様なケースではSameSite=laxが無難だろう。

SameSite=laxの場合、GETリクエストではCookieが送信されるため、CSRF攻撃を受ける可能性があるが、GETで更新系処理をしない限り基本は問題にならないと思われる。

参考