forked from NEKOGET/FuelPHP_docs_jp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
security.html
223 lines (202 loc) · 13.6 KB
/
security.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="./../assets/css/combined.css">
<link rel="shortcut icon" href="./../favicon.ico" />
<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
var path = './../';
</script>
<script src="./../assets/js/combined.js"></script>
<title>Security - 概要 - FuelPHP ドキュメント</title>
</head>
<body>
<div id="container">
<header id="header">
<div class="table">
<h1>
<a href="http://fuelphp.com"><img height="37px" width="147px" src="./../assets/img/fuel.png" /></a>
<strong>Documentation</strong>
</h1>
<form id="google_search">
<p>
<span id="search_clear"> </span>
<input type="submit" name="search_submit" id="search_submit" value="検索" />
<input type="text" value="" id="search_input" name="search_input" />
</p>
</form>
</div>
<nav>
<div class="clear"></div>
</nav>
<a href="#" id="toc_handle">目次</a>
<div class="clear"></div>
</header>
<div id="cse">
<div id="cse_point"></div>
<div id="cse_content"></div>
</div>
<div id="main">
<h2>セキュリティ</h2>
<p>
Fuel はセキュリティをとても真剣に考え、その結果、あなたの Web アプリケーションの安全を確保するための次の対策を実装しました:
</p>
<ul>
<li><a href="#output">出力エンコーディング</a></li>
<li><a href="#csrf">CSRF 保護</a></li>
<li><a href="#xss">XSS フィルタリング</a></li>
<li><a href="#input">入力フィルタリング</a></li>
<li><a href="#sql">SQL インジェクション</a></li>
</ul>
<p>
デフォルトでは Fuel は入力時に POST や GET 変数をフィルタしせず、出力時にすべてをエンコードします。
Fuel はまた URI セグメントを使ったときに予期せぬ嫌なことが起こらないように URI もエンコードし、データベースに入るすべてをエスケープします。
</p>
<p>
このページでは Fuel が提供する一般的なセキュリティ対策を説明し、<a href="../classes/security.html">Security
クラス</a>はクラスのセクションにドキュメントされています。Fuel の Security クラスの設定の詳細についてはそちらのページで見つけることができます。
</p>
<article id="output">
<h3>出力エンコーディング</h3>
<p>
デフォルトでは、Fuel は入力フィルタリングより出力エンコーディングを好みます。その理由は2つの要素からなります。
あなたのデータがどこから来たものであろうと、そしてそれがフィルタされていようがいまいが、出力エンコーディングはそのデータを
クライアントに送信する際に無害にします。これは、すべての入力は生のまま、変更のないかたちで保存され、何が起ころうと、
あなたはいつでも元データにアクセスできるとことも意味します。
</p>
<p>
これは、あなたが変更のないかたちでのデータを必要とするときに、困ったことにならないことも意味します。ひとつの一般的な例は、
エンドユーザがコンテンツを編集するために多くのアプリケーションで利用されている TinyMCE や ckeditor のような HTML エディタで生成されるデータです。
そのようなケースでは、あなたは忍び込むかもしれない予期せぬ嫌なことを取り除くために入力された変数に
<a href="#xss">XSS フィルタリング</a>を実行することを望むかもしれません。これはあなたが出力時にエンコードすることも
望まない典型的な例です。
</p>
<p>
出力エンコーディングは文字列にだけ起こるため、あなたがビューにオブジェクトを渡したいときは注意しなければいけません。
あなたのオブジェクトが <strong>__toString()</strong> メソッドを持っているか、その場合はエンコーディングが起こります、あなたのオブジェクトをセキュリティ設定のクラスのホワイトリストに追加するか(名前空間を忘れずに!)、
オブジェクトを <strong>$encode</strong> を false にセットして
ビューに渡すかを確認してください。
あなたは、<a href="../classes/view.html#method_auto_encode">auto_encode</a> メソッドを使い、ビューごとに、自動出力エンコーディングを
一時的に無効にすることもできます。
</p>
<p>
これがビューにどのように実装されているかは、<a href="views.html#security">ビューのセキュリティ</a>のセクションを参照してください。
</p>
</article>
<article id="csrf">
<h3>CSRF 保護</h3>
<p>
ワンクリック攻撃またはセッションライディングとも言われ、CSRF と略されるクロスサイト・リクエストフォージェリは、Web サイトが信頼するユーザから送信される
承認されていない命令による悪意のある攻撃の一種です。クロスサイトスクリプティング (XSS) とは異なり、
ユーザが持つ特定のサイトでの信頼を悪用し、CSRF はユーザのブラウザの中にサイトが持つ信頼を悪用します。
攻撃は、ユーザが認証されていることが知られる (あるいは想定される) サイトにアクセスするリンクやスクリプトを含むページにより
なされます。
</p>
<p>
例えば、あるユーザ、ボブは、他のユーザ、マロリーがメッセージを投稿したチャットフォーラムをブラウズするとします。
マロリーは、ボブの銀行の Web サイトでのアクションを参照する HTML イメージ要素を巧妙に作り上げたとします(画像ファイルではなく)。
もし、ボブの銀行が認証情報をクッキーに保存し、そのクッキーの期限が切れていなければ、ボブのブラウザが画像をロードしようとすると、
預金の引き出しフォームへクッキーとともに投稿してしまい、ボブが承認せずに正当な取引として処理されてしまいます。
<span style="float:right;font-style:italic;"><a href="http://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B5%E3%82%A4%E3%83%88%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%AA">情報源: wikipedia</a></span>
</p>
<p>
Fuel は、フォームにセキュリティトークンを含ませることで、この種の攻撃からあなたのフォームを保護するツールを提供します。
フォームの投稿時にトークンは検証され、検証済みの場合、フォームはフォークをリクエストしたクライアントから投稿されたことが確認されます。
</p>
<p>
CSRF 保護はアプリケーションの config/config.php ファイルの security セクションで設定できます。
</p>
<p>CSRF 保護を有効にするには、まず、フォームにトークンを追加します:</p>
<pre class="php"><code>// プレーンな HTML で
<input type="hidden" name="<?php echo \Config::get('security.csrf_token_key');?>" value="<?php echo \Security::fetch_token();?>" />
// Form クラスを使って
echo \Form::csrf();
// form インスタンスを使い、フォームのフィールドセットに検証ルールを追加して
$form = \Form::forge();
$form->add_csrf();
</code></pre>
<p>フォームをリクエストしてクライアントによって投稿されたかどうかを手動でチェックするには:</p>
<pre class="php"><code>// フォームが投稿されたかどうかチェック
if ($_POST)
{
// CSRF トークンが正しいかチェック
if ( ! \Security::check_token())
{
// CSRF 攻撃または CSRF トークンの期限切れ
}
else
{
// トークンは正しいので、フォームの入力を処理する
}
}
</code></pre>
</article>
<article id="xss">
<h3>XSS フィルタリング</h3>
<p>
Fuel は、とても高速で高度に設定可能な <a href="http://www.bioinformatics.org/phplabware/internal_utilities/htmLawed/">HTMLawed</a> ライブラリを使い、XSS フィルタリングを提供します。
ライブラリは、デフォルトではセーフおよびバランスモードで実行されます。
</p>
<p>
セーフとは、HTML 標準仕様に準拠した文法的に正しいかも知れない HTML コードに基づく、スクリプティング攻撃 (XSS のような) の脆弱性を減少させる
制限された HTML にします。
script や object のような要素、そして onmouseover や style なのど属性が入力テキストで許可されるとき、入力者は悪意のある HTML コードを挿入することができます。
</p>
<p>
バランスモードでは、HTMLawed は入力をチェックし、適切に閉じられたタグと文法的に正しい要素の内容に修正します
(すなわち、ネストされた要素は文法的に正しい必要があり、プレーンテキストは許可された要素の内容にのみ存在できます)。[訳注: 現在、バランスモードはオフに設定されています]
</p>
<p class="note">
パフォーマンスの理由から、<a href="../classes/security.html#method_xss_clean">xss_clean</a> メソッドは包括的な入力フィルタとしてではなく、
個別の入力値に使うことをお薦めします。
</p>
</article>
<article id="input">
<h3>入力フィルタリング</h3>
<p>
デフォルトでは有効になっていませんが、すべてのページリクエストで Fuel がすべての入力 ($_GET, $_POST and $_COOKIE) をフィルタするように設定できます。
そうするには、アプリケーションの config/config.php ファイルでフィルタに使用する関数やメソッドを設定します。
</p>
<pre class="php"><code>/**
* Security settings
*/
'security' => array(
'input_filter' => array(),
)</code></pre>
<p>
引数として1つの値を受け入れるPHPで実行可能なものはすべてフィルタリングのために使用できます。
PHP の 'htmlentities' のような関数、'\\Security::xss_clean' のような静的クラスメソッド、
あるいは <strong>array($object, 'method')</strong> のようなオブジェクトメソッドも使用できます。
もし、オブジェクトメソッドを使う場合は、Fuel が初期化される前にそのオブジェクトが利用できることを確認してください。入力フィルタはリクエストプロセスのとても初期段階で実行されます。
</p>
</article>
<article id="sql">
<h3>SQL インジェクション</h3>
<p>
SQL インジェクションはアプリケーションのデータベースレイヤー(SQLクエリーのような)で起こるセキュリティ脆弱性を悪用するコード挿入テクニックです。
脆弱性はユーザ入力の、SQL 文に埋め込まれる文字列リテラルのエスケープ文字が正しくフィルタされていないか、ユーザ入力が強く型付けされておらず、
それゆえ予期せず実行される場合に存在します。
これは、もっと一般的な脆弱性の分類としては、1つのプログラミングまたはスクリプティング言語が別の言語に含まれる場合に起こるものの一例です。
SQLインジェクション攻撃は、SQL 挿入攻撃とも言われます。
<br />
この形式の SQL インジェクションは、ユーザ入力のエスケープ文字がフィルタされておらず、SQL文に渡される場合に起こります。
これは結果として、アプリケーションのエンドユーザによるデータベースで実行される SQL 文の潜在的な操作をもたらします。
<span style="float:right;font-style:italic;"><a href="http://ja.wikipedia.org/wiki/SQL%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3">情報源: wikipedia</a></span>
</p>
<p>
Fuel は、Database クラスのメソッドの1つに渡されるすべての値をエスケープすることにより、SQLインジェクションから保護します。
これは Fuel の中心となるクエリビルダーのレベルで起こるため、クエリビルダーを使うすべてのコード、Fuel の ORM パッケージを含みます、は自動的にエスケープされます。
</p>
</article>
</div>
<footer>
<p>
© FuelPHP Development Team 2010-2016 - <a href="http://fuelphp.com">FuelPHP</a> is released under the MIT license.
[ <a href="https://github.com/fuel/docs/commits/1.8/develop/general/security.html">原文コミット履歴</a> | <a href="https://github.com/NEKOGET/FuelPHP_docs_jp/commits/1.8/develop_japanese/general/security.html">翻訳コミット履歴</a> | <a href="https://github.com/NEKOGET/FuelPHP_docs_jp/blob/1.8/develop_japanese/general/security.html">GitHubで修正</a> ]
</p>
</footer>
</div>
</body>
</html>