Slide 1

Slide 1 text

ブラウザ課題発表 セキュリティ・キャンプ 2022 Web セキュリティクラス 市川 拓磨 (takumma)

Slide 2

Slide 2 text

自己紹介

Slide 3

Slide 3 text

自己紹介 市川 拓磨(takumma)  鈴鹿工業高等専門学校 電子情報工学科 5年  Web フロントエンド・モバイル・デザイン  今年は SecHack365 のほうにも参加してたりします。  Twitter:@_takumma  GitHub:takumma

Slide 4

Slide 4 text

話すこと ブラウザについて調べたり実装した中で発見したこと・面白いと思ったこと (なんかあまり理解しきれてなくてふわっとした話になっちゃったかも...)

Slide 5

Slide 5 text

話すこと 1 . ヘッダーの実装のはなし 2 . ステータスコードのはなし

Slide 6

Slide 6 text

話すこと 1 . ヘッダーの実装のはなし 2 . ステータスコードのはなし

Slide 7

Slide 7 text

ヘッダーの実装のはなし - 経緯 経緯としてはf c 課題4の 302 Redirect の実装をしてた` c 302 の時は、Location ヘッダに書かれてる URL にリダイレクトする` c ヘッダを読むために、少しいじる必要があった。 (やさしいコメント)

Slide 8

Slide 8 text

仕様ではどう定義されてるんだろう?

Slide 9

Slide 9 text

Fetch Standard を覗いてみると...? g Headers クラスで定義されてる。(Not ListV g Set-Cookie のことが考慮されてるe g ヘッダーの状態を表して、変な処理から守る Guard があるe g Response から帰ってきたヘッダーの String を投げてまとめて作ろうと 思ったけど、仕様をみると append とかしかないんだなぁ。 https://fetch.spec.whatwg.org/#headers-class

Slide 10

Slide 10 text

Chromium の実装とかをみると F Fetch Standard で定義されている以外のメソッドが便宜上のために作ら れてたりするB F 仕様で定義されてる関数名と違ったりもするB F 実装を見て気がついたけど、仕様にはちゃんと処理の手順が乗ってるB F でも割と中身はゆとりがあったりもする(処理を追加してもいい! F ガチガチに制約が固められている訳ではない? https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/ fetch/headers.cc;l=152 https://fetch.spec.whatwg.org/#ref-for-concept-headers-guard⑦

Slide 11

Slide 11 text

話すこと 1 . ヘッダーの実装のはなし 2 . ステータスコードのはなし

Slide 12

Slide 12 text

ステータスコードのはなし a 302 の実装をやった派生で、他のステータスコードについても調べて みることにE a そういえば、418 I’m a teapod はどうなったんだっけ& a 定義されてないステータスコードが返されたらどんな挙動になるんだ ろう?

Slide 13

Slide 13 text

ステータスコードって、 どれくらいちゃんと定義されてるんだろう?

Slide 14

Slide 14 text

ステータスコードのはなし いろんな仕様や定義を調べてみると„ d ステータスコードは 100 ~ 599 の間で定義されてるP d 仕様されてないものは、「Unassigned」となってたP d 範囲外のものに関しては、ブラウザでは RangeError が投げられるよう になってたP d Chromium でもそういう実装が見られたP d 418 は unused になってる。 https://fetch.spec.whatwg.org/#headers-class https://www.iana.org/assignments/http-status-codes/http-status-codes.xml

Slide 15

Slide 15 text

いろんなステータスコードを返して、 Chrome の実際の挙動を調べてみた

Slide 16

Slide 16 text

50 の場合 50 で普通に受け取った(エラーも出なかった?どうして。。)

Slide 17

Slide 17 text

600 の場合 ステータスコードは受け取るけど、エラーが出た。

Slide 18

Slide 18 text

599 の場合 ステータスコードは受け取るけど、エラーが出た。 → Unassigned のものだけど、5XX なのでエラーとして出てるのかな?

Slide 19

Slide 19 text

めっちゃ大きくした場合 999999999... と、めっちゃ大きくしたら、2147483647 がブラウザで返さ れた。(curl ではエラーがでた。)

Slide 20

Slide 20 text

-50 の場合 -50 で返却してるのに、ブラウザでは 200 と表示された!

Slide 21

Slide 21 text

0 の場合 ステータスコードが表示されなかった!

Slide 22

Slide 22 text

全体的な感想

Slide 23

Slide 23 text

全体的な感想 ステータスコードとかヘッダとかはで仕様で決まっているものが列挙型 (Enum)で定義されているのかなと自分は思ってた。 でも実際はs ‰ 特定の特殊文字をバリデーショ` ‰ 範囲を超えたらエラーを出す(範囲に収まっていれば許す) それによってs ‰ フレームワークやライブラリ等で独自のヘッダを追 ‰ nginx や aws などで独自のステータスコードを追加 Web の自由度を担保しながらも、秩序が守られるように仕様が 決められてるんだなあと感じた(ふんわり)。 https://en.wikipedia.org/wiki/List_of_HTTP_status_codes