XSS とは何ですか。どう防ぎますか

利用者の入力が画面の上でスクリプトとして動いてしまう穴、と仕組みで答える問い。出力の時に文字を変えること、innerHTML を避けること、CSP は重ねる守りであることを話します。

こう聞かれます

  • 「XSS とは何ですか。どう防ぎますか」
  • 「掲示板のアプリで、投稿された文をそのまま画面に出すと何が起きますか」
  • 「React を使っていれば XSS は起きませんか」(枠組みに任せきりでないかを確かめる形)

面接官が見ている点

  • 「入力した文字が、画面の上でプログラムとして読まれてしまう」と仕組みで話せるか
  • 守りの中心が、表示する時に文字を変えることだと言えるか
  • CSP のような守りを、主な対策ではなく重ねる守りと位置づけられるか

短い答え

  • XSS は、利用者が入れた文字が画面の HTML に混ざり、ほかの人のブラウザでスクリプトとして動いてしまう穴です。
  • 防ぎ方の中心は、画面に出す時に < や " のような記号を、ただの文字として表示される形に変えることです。
  • JavaScript では innerHTML を避けて textContent を使い、そのうえで CSP を重ねる守りとして足します。

少し詳しい答え

何が起きるか

スクリプトが動くと、そのページを開いた人として操作されたり、画面の中身を書き換えられたりします。被害を受けるのは、入力した本人ではなく、その文を見たほかの利用者です。

出力の時に変える

守りは「入れる時」より「出す時」が中心です。同じ文字でも、HTML の本文に出すのか、属性の値に出すのか、URL に出すのかで、変えるべき記号が違います。出す場所に合わせて変えるのが基本です。

React などの枠組みは、{name} のように差し込んだ文字を自動で変えてくれます。ただし、HTML をそのまま差し込む書き方 (React の dangerouslySetInnerHTML など) を使うと、この守りは外れます。

innerHTML を避ける

DOM を書き換えるとき、el.innerHTML = 入力 は入力を HTML として読みます。文字を出したいだけなら el.textContent を使います。HTML を許す必要があるときは、許す要素を絞る専用の道具で消毒してから差し込みます。

CSP は重ねる守り

CSP は、ページで動いてよいスクリプトの出どころをブラウザに伝える仕組みです。穴が残っていても被害を小さくできますが、設定を誤りやすいので、これだけに頼りません。

作った物と結ぶなら、たとえば「コメントの表示で innerHTML を使っていた所を textContent に書き換え、<script> と打った投稿がただの文字として出ることを画面で確かめた」のように話します。

よくある間違い

  • 「入力の時に < を消せば十分」と言う 出す場所ごとに危ない記号は違います。守りの中心は出す時に変えることです
  • 「React だから起きない」と言い切る HTML をそのまま差し込む書き方や、利用者の入力を URL の属性に入れる所では起きえます
  • 「CSP を入れたから大丈夫」と言う CSP は重ねる守りです。出力の時に変える守りを先に整えます

深掘りの問い

  • 「XSS の種類を挙げてください」 1 回の要求で返る反射型、保存されて何度も出る蓄積型、ブラウザの中の JavaScript だけで起きる DOM 型、と答えます
  • 「リンクの href に利用者の URL を入れるときに気をつけることは」 文字を変えるだけでなく、https で始まる URL だけを許すように確かめる、と答えます
  • 「Cookie を盗まれにくくする設定は」 Cookie に HttpOnly を付けると、ページの JavaScript から読めなくなる、と答えます

確認日 2026年10月23日

技術面接問題の一覧へ戻る