# Webアプリケーションのセキュリティ

* どんな危険性がある？
  * 「安全なWebアプリケーションの作り方」p.68の図
    * Webアプリケーションの機能と脆弱性の対応
    * 出力に起因する脆弱性：インジェクション系脆弱性
    * 処理に起因する脆弱性：CSRFなど
* 攻撃パターン
  * 能動的攻撃：Webサーバに対して直接攻撃（例: SQLインジェクション）
  * 受動的攻撃1：罠サイトに利用者を誘導（例：ウィルスなどに感染させる）
  * 受動的攻撃2：正規サイトに罠が仕込まれる
  * 受動的攻撃3：罠サイトと正規サイトをまたがった攻撃（例: CSRF, XSS）

## Webブラウザ側での対策

* サンドボックス
  * ブラウザ内でプログラムを実行する場合の制限
    * ローカルファイルへのアクセスの禁止
    * プリンタなどの資源の利用禁止
    * ネットワークアクセスの制限（同一生成元ポリシー）
      * JavaScriptによるサイトをまたがったアクセスを禁止
      * Webアプリケーションに脆弱性があると受動的攻撃を受ける可能性がある

## 具体例

* インジェクション
  * HTML, HTTP, SQL, OSコマンドなど：すべて、ある書式に従ったテキスト形式でデータや処理を記述
    * 多くのWebアプリケーションでは、テキストの構造をあらかじめ決めておいて、データ（文字列）をそこに流し込む
    * 流し込む文字列に、設計時には意図しないものを混入させることで、データや処理を設計者の意図しないものに変えてしまう
  * HTMLインジェクション
    * HTMLの特殊記号（メタ文字）のエスケープ処理漏れ
      * < → \&lt; など
    * 結果として、ブラウザ上でJavascriptプログラムが実行されてしまう
    * クロスサイトスクリプティング（XSS）につながる
      * XSS: 攻撃者が用意したスクリプトの実行により
        * クッキー値を盗まれる
        * 偽の入力フォームが表示され、利用者の個人情報を盗まれる
* 対策
  * HTMLの特殊文字のエスケープ処理
    * <, >, &
    * 属性値については " や ' も
* 例
  * Yahoo! ウォレットのフィッシング
* SQLインジェクション
  * 対策
    * プレースホルダによるSQL組み立て
      * プレースホルダを含んだSQL文（文字列）を組み立て（事前）
      * SQL文コンパイル（事前）
      * プレースホルダに入力値をあてはめてSQL実行
        * 構文解析を事前に済ませることがポイント
        * SQLインジェクションの原因：入力値をもとに組み立てたSQL文を実行（構文解析）してしまうのが原因
* OSコマンド・インジェクション
* 対策
  * 流し込む文字列の検証：これだけでは不十分（設計者の想定しなかった文字列が混入されたら検証をすり抜けるかも）
* CSRF
  * 利用者がログインした状態で罠サイトを閲覧することで、利用者のブラウザから勝手に「重要な処理」を実行させられる
    * 重要な処理：パスワードの変更、クレジットカード決済など
* 例
  * なりすまし事件
    * 関連スライド参照


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kunishi.gitbook.io/web-application-textbook/security-on-webapp.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
