【Webエンジニアの求人なのに】Day5. XSSを知らない


##【Webエンジニアの求人なのに】XSSを知らない
みなさんこんにちは。
今週末も【Webエンジニアの求人なのに】シリーズやっていきます。
本日は「XXSを知らない」についてまとめたいと思います。

![3551F8E9-7F7E-4375-B809-9ACF4302652D[373].png](https://qiita-image-store.s3.amazonaws.com/0/256858/6589c342-e327-da1c-ab43-c5206500074d.png)



先週末までの記事はこちら。
[【Webエンジニアの求人なのに】Day1.GETとPOSTの違い](https://qiita.com/_ayk_study/items/b2537c5f0fcaaa7ddf08)
[【Webエンジニアの求人なのに】Day2. 公開鍵暗号を知らない](https://qiita.com/_ayk_study/items/bdce50ff05546db4a9e4)
[【Webエンジニアの求人なのに】Day3.OSI参照モデル](https://qiita.com/_ayk_study/items/cceec70145d9560624b5)
[【Webエンジニアの求人なのに】Day.4 TCP/IPを知らない](https://qiita.com/_ayk_study/items/822d6d8f694e2ebd8cdf)

やり方としては、前回までと同じように、いろいろな参考サイトをもとに回答をつくるという流れです。
初心者のため定義に誤りがあったり、まとめ方に誤りがある場合がありますが、そこについてはご指導いただければ幸いです。


##XSSとは

参考サイト
[①クロスサイトスクリプティング（XSS）とは？仕組み・脅威から対策についてのまとめ](https://viral-community.com/blog/xss-1835/)
[②第7回　いまさらながらクロスサイトスクリプティングの基礎の基礎](https://gihyo.jp/dev/serial/01/php-security/0007)
によると、

XSSは、クロスサイトスクリプティングの略。
①によると
>クロスサイトスクリプティング（XSS）とは、Webサイトへの有名な攻撃（ハッキング）手法になり、簡単にいうと「他人のWebサイトへ、悪意のあるスクリプトを埋め込む」事です。

![bulletin-board-input-form.gif](https://qiita-image-store.s3.amazonaws.com/0/256858/f6e06f42-bc2e-b737-dfa4-a5001cf76a0b.gif)
（サイト①から引用）

>このように、ページに入力フォームがあることが、クロスサイトスクリプティング（XSS）を行う上での前提条件になります。要は、この入力フォームに「悪意のあるスクリプト」を埋め込むわけですね。
ここでいう「スクリプト」とは、一般的に「javascript」を指します。

②によると、

>Webアプリケーションは，作り方を間違えると「インジェクション」（⁠コードや特殊文字などの挿入）により，セキュリティ上重大な問題を簡単に作れてしまいます。クロスサイトスクリプティングはインジェクション攻撃の中でも最も防御が複雑で難しいセキュリティ上の問題です。

と記載されていました。

###簡単なまとめ

１　入力フォーム等動的なページがあることが条件
２　１の入力フォームにHTMLもしくはjavascriptを用いた悪意のあるスクリプトを埋め込む
３　攻撃の種類は２つあり、**セッションハイジャックと個人情報の不正搾取**がある

**セッションハイジャック**…クッキー情報を抜き取り、ユーザーIDやパスワードを用いて不正アクセスを可能にする。ユーザーページにはいり、クレジットカード情報を抜き取ることも可能。

**個人情報の不正搾取**…HTMLの入力フォームなどに不正なスクリプトが埋め込まれており、氏名やメールアドレスが抜き取られる。



##XSSの詳細
図解を用いて非常にわかりやすく説明しているサイトがありました。
[③クロスサイトスクリプティングとは | 仕組みと攻撃手法](https://securitynavi.jp/7493)

![security_312.png](https://qiita-image-store.s3.amazonaws.com/0/256858/fe251da5-5709-8755-56ba-87db7092c19d.png)
（③から引用）

>（１）ユーザが悪意あるWebサイトを閲覧
（２）出力されるWebページに悪意あるスクリプトが埋め込まれている
（３）まだそのスクリプトは効果を発揮せずに標的Webサイトへ転送
（４）標的Webサイトの「スクリプトを排除しない欠陥」を介して、スクリプトが効果を発揮する形でブラウザへ戻ってくる
（５）スクリプトがブラウザで実行され、クッキー情報の漏洩、ファイルの破壊といった被害が発生する


###３種類の攻撃手法
詳しい説明は割愛しますが、攻撃の手法も様々だそうです。（詳細は[クロスサイトスクリプティングの被害内容と事例](https://securitynavi.jp/7493)や[クロスサイトスクリプティング(XSS)とは？種類と攻撃例](https://security-eggs.xyz/what_is_xss/)）
・Reflected XSS（反射型XSS）
・Stored/Persistent XSS（蓄積型/持続型XSS）
・DOM Based XSS






##XSSの対策
ざっくりですが、おなじくこちらのサイトから引用したいと思います。詳細を確認されたい方はリンク先をご参照ください。
[③クロスサイトスクリプティングとは | 仕組みと攻撃手法](https://securitynavi.jp/7493)

**１　HTMLテキストの入力を許可しない場合**
・Webページに出力する全ての要素に対して、エスケープ処理を施す（私には少し難しかったです。）

・URLの出力は、「http://」や「https://」で始まるURLのみを許可

>URLには、「http://」や「https://」から始まるものだけでなく、JavaScriptを実行できる「javascript:」の記述で始まるものもあります。
Webページに出力するリンク先や画像のURLが、外部からの入力に依存する形で動的に生成される場合、そのURLにスクリプトが含まれていると、クロスサイトスクリプティングが可能となる場合があります。

・スクリプト要素の内容を動的に生成しない

>Webページに出力するスクリプト要素の内容が、外部からの入力に依存する形で動的に生成される場合、任意のスクリプトが埋め込まれてしまう可能性があります。

・CSSを任意のサイトから取り込めるようにしない
>CSSには、expression関数等を利用してスクリプトを記述することができます。そのためサイトに置かれたCSSを取り込めるような仕様にしておくと、生成するWebページにスクリプトが注入されてしまう可能性があります。



**２　HTMLテキストの入力を許可する場合**
入力されたHTMLから構文解析木を作成し、スクリプトを含まない必要な要素のみを抽出する
>入力されたHTMLテキストに対して構文解析を行い、「ホワイトリスト方式」で許可する要素のみを抽出します。ただし、これには複雑なコーディングが要求されます。また、処理に負荷がかかるといった影響もあるため、実装には十分な検討が必要です。

**３　全てのWebアプリケーションに共通の対策**

・HTTPレスポンスヘッダのContent-Typeフィールドに文字コードを指定
>Content-Typeの出力時にcharsetを省略することなく、必ず指定しましょう






##XSSの被害事例

[クロスサイトスクリプティングの被害内容と事例](https://securitynavi.jp/7503)によると、youtubeやtwitterでの被害事例や企業のHPでの内容の不正な改ざんがあったようです。

##XSSとは？に対する回答（案）
XSSとは動的なWebページにおいて、悪意のあるスクリプトを埋め込むことにより個人情報を不正搾取したり、クッキーの情報を入手し、不正ログインを行うことである。対策としては、URLの出力は、「http://」や「https://」で始まるURLのみを許可することなどがある。



##最後に
XSSと言われ、最初はなんのことかさっぱりわかりませんでしたが、セキュリティ関連のことだと学習することができ、よりWebについて幅広く知識をつけていく必要があると感じました。
ただ、
・実際にスクリプトを埋め込むと言われ、どのように埋め込むのか？
・攻撃しやすいサイトの判断とは？（私の自作アプリは最悪な状態なのではと不安になる）
・スクリプトを埋め込む時点ではじかれるような対策はどのようなものがあるのか
・javascriptからはじまるhttp:// https://以外のURLとは


など関連する情報について理解していないところもあります。
今回は概要について知ることはできましたが、詳細に習う際は対策法等をより理解していきたいと思います。

では、次回は最後になります、「SQLインジェクション対策」についてまとめていきたいと思います。
また来週 ^^) _旦~~