XSS

Cross-Site Scripting(クロスサイトスクリプティング)は、一般的(いっぱんてき) なウェブセキュリティ脆弱性(ぜいじゃくせい) で、攻撃者(こうげきしゃ)悪意(あくい) のあるスクリプトをウェブページに注入(ちゅうにゅう) し、ユーザーのブラウザ(じょう)実行(じっこう) させることができる。この攻撃(こうげき) は、フォーム、コメント(らん)検索(けんさく) ボックスなどのユーザーインタラクション機能(きのう)() つウェブページで発生(はっせい) することが(おお) い。

XSS 脆弱性(ぜいじゃくせい)悪用(あくよう) して以下(いか)悪意(あくい) ある操作(そうさ)可能(かのう) :

  • ユーザーのセッション Cookie の窃取(せっしゅ)
  • 機密(きみつ) 情報(じょうほう)窃取(せっしゅ)
  • ウェブページ内容(ないよう)改竄(かいざん)
  • ユーザーを悪意(あくい) のあるサイトにリダイレクト

攻撃タイプ

タイプ説明(せつめい)
Stored XSS格納(かくのう) (がた)悪意(あくい) のあるスクリプトがサーバーに保存(ほぞん) され、そのページを閲覧(えつらん) するすべてのユーザーに影響(えいきょう)
Reflected XSS反射(はんしゃ) (がた)悪意(あくい) のあるスクリプトが URL パラメータを(かい) して即座(そくざ)反射(はんしゃ) 実行(じっこう)
DOM-based XSSDOM (がた) :クライアントサイドの JavaScript で DOM を操作(そうさ) する(さい)悪意(あくい) のあるスクリプトを注入(ちゅうにゅう)

防御対策

1. 入力検証

ユーザー入力(にゅうりょく) データを厳密(げんみつ)検証(けんしょう) し、悪意(あくい) のある入力(にゅうりょく)防止(ぼうし) する。

2. 出力エスケープ

ユーザー入力(にゅうりょく) データをウェブページに出力(しゅつりょく) する(さい)HTML Entity Encoding などの適切(てきせつ) なエスケープ方法(ほうほう)使用(しよう) して、スクリプトがブラウザで実行(じっこう) されるのを防止(ぼうし) する。

3. Content Security Policy (CSP)

安全(あんぜん) な HTTP ヘッダーを設定(せってい) し、()()可能(かのう) なリソースを制限(せいげん) して、悪意(あくい) のあるスクリプトの実行(じっこう)防止(ぼうし) する。

Content-Security-Policy: default-src 'self'; script-src 'self'

4. 安全な Cookie 設定

属性(ぞくせい)説明(せつめい)用途(ようと)
HttpOnlyJavaScript からの Cookie アクセスを禁止(きんし)XSS によるセッション窃取(せっしゅ)防止(ぼうし)
SecureHTTPS 接続(せつぞく) でのみ送信(そうしん)中間者(ちゅうかんしゃ) 攻撃(こうげき) による窃取(せっしゅ)防止(ぼうし)
SameSiteクロスサイトリクエストの動作(どうさ)制御(せいぎょ)CSRF 攻撃(こうげき)防止(ぼうし)

SameSite Cookie 設定

SameSite 属性(ぞくせい) は、Cookie のクロスサイトリクエスト動作(どうさ)設定(せってい) し、CSRF(Cross-Site Request Forgery)攻撃(こうげき)防止(ぼうし) するために使用(しよう) される。

(あたい)動作(どうさ)適用(てきよう) シーン
Strict第三者(だいさんしゃ) サイトからの Cookie アクセスを禁止(きんし)同一(どういつ) サイト(ない) のみ許可(きょか)銀行(ぎんこう)通販(つうはん) サイトなど決済(けっさい)(あつか) うサイト
Lax対象(たいしょう) URL へのリダイレクト GET リクエストで第三者(だいさんしゃ) の Cookie アクセスを許可(きょか) 、POST リクエストは禁止(きんし)一般的(いっぱんてき) なサイトのデフォルト()
Noneすべてのクロスサイトリクエストで Cookie アクセスを許可(きょか)Secure との併用(へいよう)必須(ひっす)クロスサイトで Cookie を共有(きょうゆう) する必要(ひつよう) があるシーン(SSO など)
SameSite=None設定(せってい) する場合(ばあい) は、(かなら)Secure 属性(ぞくせい)同時(どうじ)設定(せってい) する必要(ひつよう) がある。そうしないと Cookie はブラウザに拒否(きょひ) される。

Cookie 設定例

Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Strict