フロントエンドセキュリティ本やる
ちょっと読んで積んでたけどようやくちゃんとやる
WSLだと/etc/hosts
の設定しても上手くいかなかったので、生Windowsでやってる
4章
単純リクエストって普通にfetch
関数でGETとかPOSTとか飛ばすときも含まれるのかと思ってよく分かってなかったけど、imgタグでの画像取得とかformタグで送信するときとか、ブラウザのデフォルト動作の場合のみだった
CORS policyはあくまでもサーバーから取ってきたレスポンスをブラウザ側のjsで利用していいかどうかみたいな制限なので、単純リクエストでない場合はサーバーの処理が実行されるところまではできちゃってまずい(リソースの削除など)。よってpreflight requestを飛ばすことになる
formタグでPOSTするときはpreflight request無しにサーバー側で処理が行われてしまうが問題ないのか?
前から思ってたけど
Access-Control-Allow-Origin
に複数オリジンを指定できないのはなぜか?&ワイルドカードはOKなのはなぜか?
Goでサーバー書くときに複数オリジン指定できる何かはあったような気もする
「fetchで取得したレスポンスをブラウザで利用していいかどうか」がCORS policyかと思ってたけど、preflight requestありのときはそもそもリクエストを送信していいかどうかという部分までCORS policyに含まれてそうで、結局CORS policyとは何を表すのかが分からなくなってる?言語化むずい
ハンズオン
Access-Control-Allow-Headers
の追加前
リクエスト
access-control-request-headers:x-token
access-control-request-method:GET
レスポンス
allow:GET,HEAD,POST
追加後
レスポンスに以下が追加されていた
access-control-allow-headers:X-Token
https://zenn.dev/link/comments/a821bb74896c84 で書いた複数指定する方法出てきた
リクエストごとにヘッダーの設定してるからこれでいいのか
section 4.7
なんか難しかったので一旦スルー
ちょっと戻るけどcrossorigin
fetchのmode
とかcredentials
とかcrossorigin
とかあってややこしいけど、結局言いたいことは、CORSを用いることでimgタグなどでも安全にデータの取得をすることができるようになる、みたいな話だと理解した
CSP
jsなどのリソースの読み込みを制限するやつ
なんか色々あるけど、主にnonceやhashを使ったStrict CSPと、文字列を検査してからシンクに代入するようにすることを強制するTrusted Typesの2つが紹介されていた
CSPハンズオン
CSPを設定したらこう↓なって無事インラインスクリプトが実行されなくなった
Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-z19iSvaa+kQhmDklW27JwvQc8KDGxBk3kutkUJEQnZM='), or a nonce ('nonce-...') is required to enable inline execution.
nonceをつけると再び実行された
strict-dynamic
動的に生成したscriptタグでjsを読み込むときはstrict-dynamic
が必要とのことだったけど、今回の場合csp.ejs
に以下を追加するのでもいけた。これでもいいのか?
script.nonce = "<%= nonce %>";
Trusted Typesも無事動いた
そういえば122ページで出てきたSanitizer APIがサポート終了しちゃってた
改善された別のAPIを提供するため、一旦終了みたいな感じっぽい?
メモとしてサンプルコードのリポジトリ貼っておく
明日6章をやる
理論的にどういう脆弱性があるからこういう対策をしている、というのは理解しているつもりだけど、具体的にどういう攻撃でどうなる、みたいなのがあまり分かってなくて感覚を掴めていないので、具体例を調べてみるとよさそう
CSRF
cookieを使って勝手に変な操作されちゃうやつ
別オリジンなら使えないのではって思ってたけど、jsからいじらない or cookieにSameSite属性がついてなければできちゃうのか
トークンの利用、Double Submit Cookie、SameSite Cookie、CORSなどによる対策がある
ハンズオンはDouble Submit Cookieを用いた対策で、cookieとリクエストbodyのトークンが一致するときのみリクエストを受け付けるようにする手法
6章の最後はクリックジャッキングとかオープンリダイレクトとか
一旦終わり
今後TODO
- 7章以降
- 飛ばしたsection 4.7
- もうちょっと具体的な攻撃の例を調べてみる
- その他諸々分かってないところ調べる
全体的に雰囲気は理解したけど、まだメンタルモデルが構築できていない状態なのと、既に半分くらい忘れた