<commit_before>=================================================================================
opHardeningPlugin -- OpenPNE 3 に対して追加のセキュリティ対策を適用するプラグイン
=================================================================================

0. 概要
=======

このプラグインは、現状の OpenPNE 3 に不足している各種セキュリティ対策を透過的に施すプラグインです。

それぞれの対策について適用の有無が選択できるほか、場合によっては適用内容を細かく制御することができます。

現時点では導入するだけで以下の対策が有効になります。

* Android 標準ブラウザにおける JSON ハイジャック攻撃への対策
* Internet Explorer 8 以前における JSON ハイジャック攻撃への対策
* Internet Explorer 8 以前における JSON コンテンツを悪用した XSS 攻撃への対策
* クリックジャッキング攻撃への対策
* Internet Explorer における XSS 攻撃を誘発しかねない仕様を、 Internet Explorer 8 以降にて無効化する対策
* Internet Explorer や Google Chrome、 Safari にて備わっている XSS フィルタのブロックモードを有効にすることによる、 XSS フィルタの悪用による XSS 攻撃への対策
* UTF-8 の範囲外の文字列を悪用することによる、主に入力値検証回避を目的とした各種脆弱性への対策
* セッションクッキーに HttpOnly 属性を付加し、 XSS 脆弱性があった場合の影響を軽減する対策
* パスワード文字種および文字列長の不適切な制限の撤廃

0-1. 今後の対応予定
-------------------

* アカウントロック機構の追加
* メールアドレス変更時に変更前のメールアドレスにも通知する機構の追加
* 退会時、管理者だけでなく利用者のメールアドレスにもその旨を通知する機構の追加
* ログイン時、ログアウト時、アカウントロック時、メンバー登録時、メンバー退会時、メンバーの認証情報変更時、各種投稿時にログを残す機構の追加

1. 導入方法
===========

1-1. インストール
-----------------

お使いの plugins ディレクトリに opHardeningPlugin というディレクトリを作成し、本プラグインのすべてのファイル群がそのディレクトリに格納されているようにしてください ( ``opPlugin:install`` コマンドによってソースコードを設置済みの場合は、本作業は不要です)。

ファイルを設置した後、以下のコマンドを実行してください::

    $ ./symfony openpne:migrate --target=opHardeningPlugin

1-2. 設定
---------

本プラグインによって適用される各セキュリティ対策は、それぞれ OpenPNE.yml によって設定をおこなうことができます。

たとえば ``JSON_hijacking_protection`` というセキュリティ対策を無効にしたい場合、以下のような記述を OpenPNE.yml に追加します (インデントは半角スペース 2 つによっておこなってください。スペースではなくタブ文字を使用したり、 1 インデントあたりのスペースの数に誤りがあった場合は文法エラーとなります)::

    hardening:
      JSON_hijacking_protection:
        enabled: false

``JSON_hijacking_protection`` の他に、 ``escape_html_in_JSON`` を無効にしたくなった場合は、追記部分を以下のように変更します::

    hardening:
      JSON_hijacking_protection:
        enabled: false
      escape_html_in_JSON:
        enabled: false

どのようなセキュリティ対策が存在し、どのような設定をサポートしているかについては、「2. 各セキュリティ対策毎の詳細」の章を参照してください。

2. 各セキュリティ対策毎の詳細
=============================

2-1. JSON_hijacking_protection
------------------------------

:保護対象の攻撃: JSON ハイジャック攻撃
:保護対象の脅威: 情報漏洩
:対策の種類: 防止

特定環境における JSON ハイジャック攻撃を受けなくするようにリクエストとレスポンスの検証、およびレスポンスの加工をおこないます。

2-1-1. 設定
```````````

enabled : 真偽値 (デフォルト: ``true``)
    この対策を適用する場合は ``true`` を、しない場合は ``false`` を指定します。

2-1-2. Android 標準ブラウザに対する対策内容についての解説
`````````````````````````````````````````````````````````

Android 標準ブラウザの多くのバージョンでは、他の主要ブラウザでは対策済みの手法による JSON ハイジャック攻撃が未だに有効です。この攻撃への対策として、 Android で application/json のコンテンツをブラウジングした際に、次に挙げる条件を 1 つも満たしていない場合、エラーを返すようになります。

* POST リクエストである
* X-Requested-With リクエストヘッダの値が XMLHttpRequest である

この条件を満たさなかった場合、 ``Your request is denied. Please retry to request with "X-Requested-With" header.`` といったエラーを残し、本来のレスポンスの送信を拒否します。

2-1-3. Internet Explorer 8 以前に対する対策内容についての解説
`````````````````````````````````````````````````````````````

Internet Explorer 8 以前では、 JSON コンテンツを UTF-7 で記述された JavaScript として外部から読み込むことで、 JSON ハイジャック攻撃が成立する問題があります。

UTF-7 では JSON ハイジャック攻撃にて用いるメタ文字 (が、通常エスケープされる) を、 UTF-7 独特の記法によっても表現することができます。そのため、 Internet Explorer のように UTF-7 を解釈するブラウザが、 UTF-7 としてエンコードされた場合に JSON の構文を破壊しうる文字列を含む UTF-8 コンテンツを UTF-7 として読み込んでしまうと、 JSON ハイジャック攻撃が成立してしまうことになります。

この問題への対策として、 UTF-7 独特の記法の開始文字である + (プラス) 記号を Unicode エスケープシーケンス \\u002b に変換することによって、コンテンツが UTF-7 として解釈されたとしても、 JSON ハイジャックとならないようにレスポンスを加工します。

2-2. escape_html_in_JSON
------------------------

:保護対象の攻撃: XSS 攻撃
:保護対象の脅威: 情報漏洩、なりすまし、表示コンテンツの改竄
:対策の種類: 防止
<commit_msg>modify REDME.rst to adjust da02915a40f64004d3aa70e70359c370ac5db276 changes<commit_after>=================================================================================
opHardeningPlugin -- OpenPNE 3 に対して追加のセキュリティ対策を適用するプラグイン
=================================================================================

0. 概要
=======

このプラグインは、現状の OpenPNE 3 に不足している各種セキュリティ対策を透過的に施すプラグインです。

それぞれの対策について適用の有無が選択できるほか、場合によっては適用内容を細かく制御することができます。

現時点では導入するだけで以下の対策が有効になります。

* Android 標準ブラウザにおける JSON ハイジャック攻撃への対策
* Internet Explorer 9 および 10 においてクロスドメインの JSON の内容が読み取れる問題への対策
* Internet Explorer 8 以前における JSON ハイジャック攻撃への対策
* Internet Explorer 8 以前における JSON コンテンツを悪用した XSS 攻撃への対策
* クリックジャッキング攻撃への対策
* Internet Explorer における XSS 攻撃を誘発しかねない仕様を、 Internet Explorer 8 以降にて無効化する対策
* Internet Explorer や Google Chrome、 Safari にて備わっている XSS フィルタのブロックモードを有効にすることによる、 XSS フィルタの悪用による XSS 攻撃への対策
* UTF-8 の範囲外の文字列を悪用することによる、主に入力値検証回避を目的とした各種脆弱性への対策
* セッションクッキーに HttpOnly 属性を付加し、 XSS 脆弱性があった場合の影響を軽減する対策
* パスワード文字種および文字列長の不適切な制限の撤廃

0-1. 今後の対応予定
-------------------

* アカウントロック機構の追加
* メールアドレス変更時に変更前のメールアドレスにも通知する機構の追加
* 退会時、管理者だけでなく利用者のメールアドレスにもその旨を通知する機構の追加
* ログイン時、ログアウト時、アカウントロック時、メンバー登録時、メンバー退会時、メンバーの認証情報変更時、各種投稿時にログを残す機構の追加

1. 導入方法
===========

1-1. インストール
-----------------

お使いの plugins ディレクトリに opHardeningPlugin というディレクトリを作成し、本プラグインのすべてのファイル群がそのディレクトリに格納されているようにしてください ( ``opPlugin:install`` コマンドによってソースコードを設置済みの場合は、本作業は不要です)。

ファイルを設置した後、以下のコマンドを実行してください::

    $ ./symfony openpne:migrate --target=opHardeningPlugin

1-2. 設定
---------

本プラグインによって適用される各セキュリティ対策は、それぞれ OpenPNE.yml によって設定をおこなうことができます。

たとえば ``JSON_hijacking_protection`` というセキュリティ対策を無効にしたい場合、以下のような記述を OpenPNE.yml に追加します (インデントは半角スペース 2 つによっておこなってください。スペースではなくタブ文字を使用したり、 1 インデントあたりのスペースの数に誤りがあった場合は文法エラーとなります)::

    hardening:
      JSON_hijacking_protection:
        enabled: false

``JSON_hijacking_protection`` の他に、 ``escape_html_in_JSON`` を無効にしたくなった場合は、追記部分を以下のように変更します::

    hardening:
      JSON_hijacking_protection:
        enabled: false
      escape_html_in_JSON:
        enabled: false

どのようなセキュリティ対策が存在し、どのような設定をサポートしているかについては、「2. 各セキュリティ対策毎の詳細」の章を参照してください。

2. 各セキュリティ対策毎の詳細
=============================

2-1. JSON_hijacking_protection
------------------------------

:保護対象の攻撃: JSON ハイジャック攻撃 (他、 JSON からの情報漏洩に繋がる攻撃も含む)
:保護対象の脅威: 情報漏洩
:対策の種類: 防止

特定環境における JSON ハイジャック攻撃を受けなくするようにリクエストとレスポンスの検証、およびレスポンスの加工をおこないます。

2-1-1. 設定
```````````

enabled : 真偽値 (デフォルト: ``true``)
    この対策を適用する場合は ``true`` を、しない場合は ``false`` を指定します。

2-1-2. Android 標準ブラウザに対する対策内容についての解説
`````````````````````````````````````````````````````````

Android 標準ブラウザの多くのバージョンでは、他の主要ブラウザでは対策済みの手法による JSON ハイジャック攻撃が未だに有効です。この攻撃への対策として、 Android で application/json のコンテンツをブラウジングした際に、次に挙げる条件を 1 つも満たしていない場合、エラーを返すようになります。

* POST リクエストである
* X-Requested-With リクエストヘッダの値が XMLHttpRequest である

この条件を満たさなかった場合、 ``Your request is denied. Please retry to request with "X-Requested-With" header.`` といったエラーを残し、本来のレスポンスの送信を拒否します。

2-1-3. Internet Explorer 9 および 10 においてクロスドメインの JSON の内容が読み取れる問題への対策について解説
`````````````````````````````````````````````````````````````````````````````````````````````````````````````

Internet Explorer 9 および 10 においては、 http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2013-1297 にて公表されている、クロスドメインの JSON の内容を読み取ることにできる問題が、仕様であるとして修正されていません。

そこで、 Internet Explorer 9 および 10 で application/json のコンテンツをブラウジングした際にも、「2-1-2. Android 標準ブラウザに対する対策内容についての解説」にて解説したような対策が適用されます。

なお、 この問題については、機密情報を含む JSON コンテンツのレスポンスヘッダとして X-Content-Type-Options: nosniff を送信することでも対策となります。したがって、この「JSON_hijacking_protection」を無効にした場合でも、後述する「disable_content_sniffing」が有効であれば、この問題の影響を受けることはなくなります。

2-1-4. Internet Explorer 8 以前に対する対策内容についての解説
`````````````````````````````````````````````````````````````

Internet Explorer 8 以前では、 JSON コンテンツを UTF-7 で記述された JavaScript として外部から読み込むことで、 JSON ハイジャック攻撃が成立する問題があります。

UTF-7 では JSON ハイジャック攻撃にて用いるメタ文字 (が、通常エスケープされる) を、 UTF-7 独特の記法によっても表現することができます。そのため、 Internet Explorer のように UTF-7 を解釈するブラウザが、 UTF-7 としてエンコードされた場合に JSON の構文を破壊しうる文字列を含む UTF-8 コンテンツを UTF-7 として読み込んでしまうと、 JSON ハイジャック攻撃が成立してしまうことになります。

この問題への対策として、 UTF-7 独特の記法の開始文字である + (プラス) 記号を Unicode エスケープシーケンス \\u002b に変換することによって、コンテンツが UTF-7 として解釈されたとしても、 JSON ハイジャックとならないようにレスポンスを加工します。

2-2. escape_html_in_JSON
------------------------

:保護対象の攻撃: XSS 攻撃
:保護対象の脅威: 情報漏洩、なりすまし、表示コンテンツの改竄
:対策の種類: 防止

{'fraction_non_alphanumeric': 0.1847923322683706, 'fraction_numerical': 0.01853035143769968, 'mean_word_length': 6.1340018231540565, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7500432', 'n_tokens_mistral': 5656, 'n_tokens_neox': 5237, 'n_words': 521}