個人的に「Webサービスの公開前チェックリスト」を作っていたのですが、けっこう育ってきたので公開します。このリストは、過去に自分がミスしたときや、情報収集する中で「明日は我が身…」と思ったときなどに個人的にメモしてきたものをまとめた内容になります。
!ヌケモレや偏りがあることや、サービスの要件によって当てはまらない項目があることをあらかじめご了承ください。
LaxもしくはStrictになっていることLaxの場合、GETリクエストで更新処理を行っているエンドポイントがないか合わせて確認example.comのCookieが採用サイトのjobs.example.comにも送られるようになっており、そのサーバーに脆弱性がある等__Host-とするとDomain属性が空になっていないCookieの指定を無視してくれる(参考:Cookie Prefixのバイパス)#"31">正規表現を使う場合、バイパスできないかチェックする(文頭チェック漏れや、Rubyのマルチラインフラグのバイパスなど)element.innerHtml = inputやReactのdangerousllySetInnerHtmlのような部分https://example.com/◯◯にあてられる場合は要注意/_ahはリザーブされている)/404へのリクエストをフレームワークが自動的に404にすることがある。パスの構成によっては問題ない)adminやcontactなど(参考:reserved-usernames)Strict-Transport-Security がレスポンスヘッダに指定されていること{key:'Strict-Transport-Security',value:'max-age=31536000; includeSubDomains; preload'}X-Frame-Options: "DENY"もしくはX-Frame-Options: "SAMEORIGIN"が付与されていることframe-ancestorsを設定した方が良いようです)X-Content-Type-Options: nosniffが指定されていることhttps://example.com/login?redirect_to=https://evil.exampleを踏んだときにhttps://evil.exampleにリダイレクトしないようにするupdateMany/deleteManyを特定のクエリ以外では使えないようにExtensionsで設定している。https://example.com/products/fooとhttps://example.com/products/foo?query=barが同一内容であることを検索エンジンが認識できるようにする<title>タグと<h1>タグの内容に「検索結果: ◯◯」と明確に含めるようにする。でないと、おかしなキーワードが検索結果にインデックスされてしまう可能性があるhttps://example.com/search?keyword=UNKOのページタイトルが「UNKO」になっていたら「UNKO」が検索結果にインデックスされてしまうかも<img>)のalt属性が適切に指定されていること<button>や<a>の役割がスクリーンリーダーからも認識できるようになっていること<ahref="/"aria-label="リンクの役割を示すテキスト"><svgaria-hidden="true"...></svg></a>この2つは忘れがちなのでチェックリストに入れました。その他の項目ついてはfreeeアクセシビリティー・ガイドラインが参考になります。
<html lang="ja">となっていることlang="en"となっていることがあるので注意「これも忘れがちだから入れた方がいいのでは?」という内容があればコメントなどで教えていただけると嬉しいです。
バッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。
凄く有益な記事をありがとうございます!
普段意識してはいるものの言語化できていないことが多いので、
こういったチェックシートは大変ありがたいです...!
認証に関わるCookieの属性
XSSが発生した際にはcredentials:includeで叩かれるので無意味だ!なんて話も聞きますが、
攻撃者が認証情報を手にして手元の端末から好き勝手叩かれるようなことは無くなるので緩和策にはなるんですよね。
重要な情報へのアクセスにはパスワードを必須化するといった設計の話も組み込まれておりますし、要点が箇条書きでまとまっており大変読みやすいです。
是非いろんな人に見てもらいたいですね。
有益な記事の執筆ありがとうございます。勉強になりました!
認証に関わるCookieの属性
Cookieの設定が不適切な場合、ブラウザ側でCookieを拒否して安全性を高める仕様があります。
https://asnokaze.hatenablog.com/entry/2024/05/07/002720#Cookie名プレフィックス-Cookie-Name-Prefixes
https://caniuse.com/?search=Cookie prefixes
Secure属性が設定されていること
クッキー名のプレフィックスに__Secure- をつけると、Secure属性を持たないCookieはブラウザで拒否されます。
Domain属性が適切に設定されていること
クッキー名のプレフィックスに__Host- をつけると、Secure属性・Path属性==/・Domain属性無しを満たさないクッキーはブラウザで拒否されます。
すでにご存じでしたら、すいません。
とても参考になる記事ありがとうございます!
決済機能をつける場合
私の場合、こちらにサブスクリプション決済が有効期限切れなどでエラーが出た際に、アプリケーション側でしっかり管理できているかを追加しますね!
何度か失敗しているものでして・・・!