こう 聞かれます
- 「XSS とは
何ですか。 どう 防ぎますか」 - 「掲示板の
アプリで、 投稿された 文を そのまま 画面に 出すと 何が 起きますか」 - 「React を
使っていれば XSS は 起きませんか」 (枠組みに 任せきりでないかを 確かめる形)
面接官が 見ている点
- 「入力した
文字が、 画面の 上で プログラムとして 読まれてしまう」と 仕組みで話せるか - 守りの
中心が、 表示する 時に 文字を 変える ことだと言えるか - CSP のような
守りを、 主な 対策ではなく 重ねる 守りと 位置づけられるか
短い答え
- XSS は、
利用者が 入れた 文字が 画面の HTML に 混ざり、 ほかの 人の ブラウザで スクリプトとして 動いてしまう穴です。 - 防ぎ方の
中心は、 画面に 出す時に <や"のような記号を、 ただの 文字として 表示される 形に 変える ことです。 - JavaScript では innerHTML を
避けて textContent を 使い、 そのうえで CSP を 重ねる 守りとして 足します。
少し 詳しい答え
何が起きるか
スクリプトが
出力の 時に変える
守りは
React などの{name} のようにdangerouslySetInnerHTML など
innerHTML を避ける
DOM をel.innerHTML = 入力 はel.textContent を
CSP は 重ねる守り
CSP は、
作った<script> と
よく ある間違い
- 「入力の
時に <を消せば 十分」と言う 出す場所ごとに 危ない 記号は 違います。 守りの 中心は 出す時に 変えることです - 「React だから
起きない」と言い切る HTML を そのまま 差し込む 書き方や、 利用者の 入力を URL の 属性に 入れる 所では 起きえます - 「CSP を
入れたから 大丈夫」と言う CSP は 重ねる 守りです。 出力の 時に 変える 守りを 先に整えます
深掘りの問い
- 「XSS の
種類を 挙げてください」 1 回の 要求で 返る 反射型、 保存されて 何度も 出る 蓄積型、 ブラウザの 中の JavaScript だけで 起きる DOM 型、と答えます - 「リンクの href に
利用者の URL を 入れる ときに 気を つけることは」 文字を 変えるだけでなく、 httpsで始まる URL だけを 許すように 確かめる、と答えます - 「Cookie を
盗まれにくくする設定は」 Cookie に HttpOnly を 付けると、 ページの JavaScript から 読めなくなる、と答えます