mirror of
https://github.com/yiisoft/yii2.git
synced 2025-12-19 07:07:58 +08:00
docs/guide-ja updated [ci skip] (#11537)
* docs/guide-ja translations updated [skip ci] * docs/guide-ja security-* updated [ci skip]
This commit is contained in:
committed by
Carsten Brandt
parent
2eb90f82fe
commit
e96f956f8a
@@ -109,9 +109,12 @@ All Rights Reserved.
|
||||
セキュリティ
|
||||
------------
|
||||
|
||||
* [概要](security-overview.md)
|
||||
* [認証](security-authentication.md)
|
||||
* [権限付与](security-authorization.md)
|
||||
* [パスワードを扱う](security-passwords.md)
|
||||
* [暗号化](security-cryptography.md)
|
||||
* [ビューのセキュリティ](structure-views.md#security)
|
||||
* [認証クライアント](https://github.com/yiisoft/yii2-authclient/blob/master/docs/guide-ja/README.md)
|
||||
* [ベストプラクティス](security-best-practices.md)
|
||||
|
||||
|
||||
@@ -287,7 +287,7 @@ Yii は、新しいオブジェクトを作成するさい、そのコアコー
|
||||
\Yii::$container->set('yii\widgets\LinkPager', ['maxButtonCount' => 5]);
|
||||
```
|
||||
|
||||
次のコードでビューでウィジェットを使用すれば、 `maxButtonCount` プロパティは、
|
||||
そして、次のコードでビューでウィジェットを使用すれば、`maxButtonCount` プロパティは、
|
||||
クラスで定義されているデフォルト値 10 の代わりに 5 で初期化されます。
|
||||
|
||||
```php
|
||||
@@ -300,6 +300,8 @@ echo \yii\widgets\LinkPager::widget();
|
||||
echo \yii\widgets\LinkPager::widget(['maxButtonCount' => 20]);
|
||||
```
|
||||
|
||||
> Tip: どのような型の値であろうとも上書きされますので、オプションの配列の指定には気を付けてください。オプションの配列はマージされません。
|
||||
|
||||
DI コンテナの自動コンストラクタ・インジェクションの利点を活かす別の例です。
|
||||
あなたのコントローラクラスが、ホテル予約サービスのような、いくつかの他のオブジェクトに依存するとします。
|
||||
あなたは、コンストラクタパラメータを通して依存関係を宣言して、DI コンテナにあなたの課題を解決させることができます。
|
||||
|
||||
@@ -668,6 +668,10 @@ class m150101_185401_create_news_table extends Migration
|
||||
* [[yii\db\Migration::dropForeignKey()|dropForeignKey()]]: 外部キーを削除
|
||||
* [[yii\db\Migration::createIndex()|createIndex()]]: インデックスを作成
|
||||
* [[yii\db\Migration::dropIndex()|dropIndex()]]: インデックスを削除
|
||||
* [[yii\db\Migration::addCommentOnColumn()|addCommentOnColumn()]: カラムにコメントを追加
|
||||
* [[yii\db\Migration::dropCommentFromColumn()|dropCommentFromColumn()]: カラムからコメントを削除
|
||||
* [[yii\db\Migration::addCommentOnTable()|addCommentOnTable()]: テーブルにコメントを追加
|
||||
* [[yii\db\Migration::dropCommentFromTable()|dropCommentFromTable()]: テーブルからコメントを削除
|
||||
|
||||
> Info: [[yii\db\Migration]] は、データベースクエリメソッドを提供しません。
|
||||
これは、通常、データベースからのデータ取得については、メッセージを追加して表示する必要がないからです。
|
||||
@@ -692,6 +696,9 @@ yii migrate
|
||||
リストされたマイグレーションを適用することをあなたが確認すると、タイムスタンプの値の順に、一つずつ、すべての新しいマイグレーションクラスの `up()` または `safeUp()` メソッドが実行されます。
|
||||
マイグレーションのどれかが失敗した場合は、コマンドは残りのマイグレーションを適用せずに終了します。
|
||||
|
||||
> Tip: あなたのサーバでコマンドラインを使用できない場合は
|
||||
> [web shell](https://github.com/samdark/yii2-webshell) エクステンションを使ってみてください。
|
||||
|
||||
適用が成功したマイグレーションの一つ一つについて、`migration` という名前のデータベーステーブルに行が挿入されて、マイグレーションの成功が記録されます。
|
||||
この記録によって、マイグレーションツールは、どのマイグレーションが適用され、どのマイグレーションが適用されていないかを特定することが出来ます。
|
||||
|
||||
|
||||
@@ -332,6 +332,20 @@ $query->filterWhere([
|
||||
|
||||
[[yii\db\Query::andWhere()|andWhere()]] または [[yii\db\Query::orWhere()|orWhere()]] と同じように、[[yii\db\Query::andFilterWhere()|andFilterWhere()]] または [[yii\db\Query::orFilterWhere()|orFilterWhere()]] を使って、既存の条件に別のフィルタ条件を追加することも出来ます。
|
||||
|
||||
さらに加えて、値の方に含まれている比較演算子を適切に判断してくれる [[yii\db\Query::andFilterCompare()]] があります。
|
||||
|
||||
```php
|
||||
$query->andFilterCompare('name', 'John Doe');
|
||||
$query->andFilterCompare('rating', '>9');
|
||||
$query->andFilterCompare('value', '<=100');
|
||||
```
|
||||
|
||||
比較演算子を明示的に指定することも可能です。
|
||||
|
||||
```php
|
||||
$query->andFilterCompare('name', 'Doe', 'like');
|
||||
```
|
||||
|
||||
### [[yii\db\Query::orderBy()|orderBy()]] <span id="order-by"></span>
|
||||
|
||||
[[yii\db\Query::orderBy()|orderBy()]] メソッドは SQL クエリの `ORDER BY` 句を指定します。例えば、
|
||||
@@ -580,6 +594,13 @@ $query = (new \yii\db\Query())
|
||||
|
||||
この無名関数は、現在の行データを含む `$row` というパラメータを取り、現在の行のインデックス値として使われるスカラ値を返さなくてはなりません。
|
||||
|
||||
> Note: [[yii\db\Query::groupBy()|groupBy()]] や [[yii\db\Query::orderBy()|orderBy()]]
|
||||
> のようなクエリメソッドが SQL に変換されてクエリの一部となるのとは対照的に、
|
||||
> このメソッドはデータベースからデータが取得された後で動作します。
|
||||
> このことは、クエリの SELECT に含まれるカラム名だけを使うことが出来る、ということを意味します。
|
||||
> また、テーブルプレフィックスを付けてカラムを選択した場合、例えば `customer.id` を選択した場合は、
|
||||
> リザルトセットのカラム名は `id` しか含みませんので、テーブルプレフィックス無しで `->indexBy('id')` と呼ぶ必要があります。
|
||||
|
||||
|
||||
## バッチクエリ <span id="batch-query"></span>
|
||||
|
||||
|
||||
@@ -76,6 +76,10 @@ $form = ActiveForm::begin([
|
||||
例えば、上記の例における `username` 属性のインプットフィールドの名前は `LoginForm[username]` となります。
|
||||
この命名規則の結果として、ログインフォームの全ての属性が配列として、サーバ側においては `$_POST['LoginForm']` に格納されて利用できることになります。
|
||||
|
||||
> Tip: 一つのフォームに一つのモデルだけがある場合、インプットの名前を単純化したいときは、
|
||||
> モデルの [[yii\base\Model::formName()|formName()]] メソッドをオーバーライドして空文字列を返すようにして、配列の部分をスキップすることが出来ます。
|
||||
> この方法を使えば、[GridView](output-data-widgets.md#grid-view) で使われるフィルターモデルで、もっと見栄えの良い URL を生成させることが出来ます。
|
||||
|
||||
モデルの属性を指定するために、もっと洗練された方法を使うことも出来ます。
|
||||
例えば、複数のファイルをアップロードしたり、複数の項目を選択したりする場合に、属性の名前に `[]` を付けて、属性が配列の値を取り得ることを指定することが出来ます。
|
||||
|
||||
|
||||
@@ -90,6 +90,27 @@ public function rules()
|
||||
|
||||
属性は、上記の検証のステップに従って、`scenarios()` でアクティブな属性であると宣言されており、かつ、`rules()` で宣言された一つまたは複数のアクティブな規則と関連付けられている場合に、また、その場合に限って、検証されます。
|
||||
|
||||
> Note: 規則に名前を付けると便利です。すなわち、
|
||||
> ```php
|
||||
> public function rules()
|
||||
> {
|
||||
> return [
|
||||
> // ...
|
||||
> 'password' => [['password'], 'string', 'max' => 60],
|
||||
> ];
|
||||
> }
|
||||
> ```
|
||||
>
|
||||
> これを子のモデルで使うことが出来ます。
|
||||
>
|
||||
> ```php
|
||||
> public function rules()
|
||||
> {
|
||||
> $rules = parent::rules();
|
||||
> unset($rules['password']);
|
||||
> return $rules;
|
||||
> }
|
||||
|
||||
|
||||
### エラーメッセージをカスタマイズする <span id="customizing-error-messages"></span>
|
||||
|
||||
@@ -526,6 +547,9 @@ JS;
|
||||
> ]
|
||||
> ```
|
||||
|
||||
> Tip: クライアント側の検証を手動で操作する必要がある場合、すなわち、動的にフィールドを追加したり、何か特殊な UI ロジックを実装する場合は、
|
||||
> Yii 2.0 Cookbook の [Working with ActiveForm via JavaScript](https://github.com/samdark/yii2-cookbook/blob/master/book/forms-activeform-js.md) を参照してください。
|
||||
|
||||
### Deferred 検証 <span id="deferred-validation"></span>
|
||||
|
||||
非同期のクライアント側の検証をサポートする必要がある場合は、[Defered オブジェクト](http://api.jquery.com/category/deferred-object/) を作成することが出来ます。
|
||||
|
||||
@@ -392,6 +392,9 @@ class PostSearch extends Post
|
||||
|
||||
```
|
||||
|
||||
> Tip: フィルタのクエリを構築する方法を学ぶためには、[クエリビルダ](db-query-builder.md)、
|
||||
> 中でも特に [フィルタ条件](db-query-builder.md#filter-conditions) を参照してください。
|
||||
|
||||
この `search()` メソッドをコントローラで使用して、GridView のためのデータプロバイダを取得することが出来ます。
|
||||
|
||||
```php
|
||||
|
||||
@@ -234,6 +234,8 @@ Yii は個々のクッキーを [[yii\web\Cookie]] のオブジェクトとし
|
||||
[[yii\web\Request]] と [[yii\web\Response]] は、ともに、`cookies` という名前のプロパティによって、クッキーのコレクションを保持します。
|
||||
後者のクッキーコレクションはリクエストの中で送信されてきたクッキーを表し、一方、後者のクッキーコレクションは、これからユーザに送信されるクッキーを表します。
|
||||
|
||||
アプリケーションで、リクエストとレスポンスを直接に操作する部分は、コントローラです。
|
||||
従って、クッキーの読み出しと送信はコントローラで実行されるべきです。
|
||||
|
||||
### クッキーを読み出す <span id="reading-cookies"></span>
|
||||
|
||||
|
||||
68
docs/guide-ja/security-cryptography.md
Normal file
68
docs/guide-ja/security-cryptography.md
Normal file
@@ -0,0 +1,68 @@
|
||||
暗号化
|
||||
======
|
||||
|
||||
個の節では、セキュリティの以下の側面について見ていきます。
|
||||
|
||||
- 乱数データの生成
|
||||
- 暗号化と複合化
|
||||
- データの完全性の確認
|
||||
|
||||
|
||||
擬似乱数データを生成する
|
||||
------------------------
|
||||
|
||||
擬似乱数データはさまざまな状況で役に立ちます。
|
||||
例えば、メール経由でパスワードをリセットするときは、トークンを生成してデータベースに保存し、それをユーザにメールで送信します。
|
||||
そして、ユーザはこのトークンを自分がアカウントの所有者であることの証拠として使用します。
|
||||
このトークンがユニークかつ推測困難なものであることは非常に重要なことです。
|
||||
さもなくば、攻撃者がトークンの値を推測してユーザのパスワードをリセットする可能性があります。
|
||||
|
||||
Yii のセキュリティヘルパは擬似乱数データの生成を単純な作業にしてくれます。
|
||||
|
||||
|
||||
```php
|
||||
$key = Yii::$app->getSecurity()->generateRandomString();
|
||||
```
|
||||
|
||||
暗号化と復号化
|
||||
--------------
|
||||
|
||||
Yii は秘密鍵を使ってデータを暗号化/復号化することを可能にする便利なヘルパ関数を提供しています。
|
||||
データを暗号化関数に渡して、秘密鍵を持つ者だけが復号化することが出来るようにすることが出来ます。
|
||||
例えば、何らかの情報をデータベースに保存する必要があるけれども、(たとえアプリケーションのデータベースが第三者に漏洩した場合でも) 秘密鍵を持つユーザだけがそれを見ることが出来るようにする必要がある、という場合には次のようにします。
|
||||
|
||||
```php
|
||||
// $data と $secretKey はフォームから取得する
|
||||
$encryptedData = Yii::$app->getSecurity()->encryptByPassword($data, $secretKey);
|
||||
// $encryptedData をデータベースに保存する
|
||||
```
|
||||
|
||||
そして、後でユーザがデータを読みたいときは、次のようにします。
|
||||
|
||||
```php
|
||||
// $secretKey はユーザ入力から取得、$encryptedData はデータベースから取得
|
||||
$data = Yii::$app->getSecurity()->decryptByPassword($encryptedData, $secretKey);
|
||||
```
|
||||
|
||||
[[\yii\base\Security::encryptByKey()]] と [[\yii\base\Security::decryptByKey()]] によって、パスワードの代わりにキーを使うことも可能です。
|
||||
|
||||
|
||||
データの完全性を確認する
|
||||
------------------------
|
||||
|
||||
データが第三者によって改竄されたり、更には何らかの形で毀損されたりしていないことを確認する必要がある、という場合があります。
|
||||
Yii は二つのヘルパ関数の形で、データの完全性を確認するための簡単な方法を提供しています。
|
||||
|
||||
秘密鍵とデータから生成されたハッシュをデータにプレフィクスします。
|
||||
|
||||
```php
|
||||
// $secretKey はアプリケーションまたはユーザの秘密、$genuineData は信頼できるソースから取得
|
||||
$data = Yii::$app->getSecurity()->hashData($genuineData, $secretKey);
|
||||
```
|
||||
|
||||
データの完全性が毀損されていないかチェックします。
|
||||
|
||||
```php
|
||||
// $secretKey はアプリケーションまたはユーザの秘密、$data は信頼できないソースから取得
|
||||
$data = Yii::$app->getSecurity()->validateData($data, $secretKey);
|
||||
```
|
||||
14
docs/guide-ja/security-overview.md
Normal file
14
docs/guide-ja/security-overview.md
Normal file
@@ -0,0 +1,14 @@
|
||||
セキュリティ
|
||||
============
|
||||
|
||||
十分なセキュリティは、すべてのアプリケーションの健全さと成功のために欠くことが出来ないものです。
|
||||
不幸なことに、理解が不足しているためか、実装の難易度が高すぎるためか、セキュリティのことになると手を抜く開発者がたくさんいます。
|
||||
Yii によって駆動されるあなたのアプリケーションを可能な限り安全にするために、Yii はいくつかの優秀な使いやすいセキュリティ機能を内蔵しています。
|
||||
|
||||
* [認証](security-authentication.md)
|
||||
* [権限付与](security-authorization.md)
|
||||
* [パスワードを扱う](security-passwords.md)
|
||||
* [暗号化](security-cryptography.md)
|
||||
* [ビューのセキュリティ](structure-views.md#security)
|
||||
* [認証クライアント](https://github.com/yiisoft/yii2-authclient/blob/master/docs/guide-ja/README.md)
|
||||
* [ベストプラクティス](security-best-practices.md)
|
||||
@@ -1,16 +1,6 @@
|
||||
パスワードを扱う
|
||||
================
|
||||
|
||||
> Note: この節はまだ執筆中です。
|
||||
|
||||
十分なセキュリティは、すべてのアプリケーションの健全さと成功のために欠くことが出来ないものです。
|
||||
不幸なことに、理解が不足しているためか、実装の難易度が高すぎるためか、セキュリティのことになると手を抜く開発者がたくさんいます。
|
||||
Yii によって駆動されるあなたのアプリケーションを可能な限り安全にするために、Yii はいくつかの優秀な使いやすいセキュリティ機能を内蔵しています。
|
||||
|
||||
|
||||
ハッシュとパスワードの検証
|
||||
--------------------------
|
||||
|
||||
ほとんどの開発者はパスワードを平文テキストで保存してはいけないということを知っていますが、パスワードを `md5` や `sha1` でハッシュしてもまだ安全だと思っている開発者がたくさんいます。
|
||||
かつては、前述のハッシュアルゴリズムを使えば十分であった時もありましたが、現代のハードウェアをもってすれば、そのようなハッシュはブルートフォースアタックを使って非常に簡単に復元することが可能です。
|
||||
|
||||
@@ -38,115 +28,3 @@ if (Yii::$app->getSecurity()->validatePassword($password, $hash)) {
|
||||
// パスワードが違う
|
||||
}
|
||||
```
|
||||
|
||||
擬似乱数データを生成する
|
||||
------------------------
|
||||
|
||||
擬似乱数データはさまざまな状況で役に立ちます。
|
||||
例えば、メール経由でパスワードをリセットするときは、トークンを生成してデータベースに保存し、それをユーザにメールで送信します。
|
||||
そして、ユーザはこのトークンを自分がアカウントの所有者であることの証拠として使用します。
|
||||
このトークンがユニークかつ推測困難なものであることは非常に重要なことです。
|
||||
さもなくば、攻撃者がトークンの値を推測してユーザのパスワードをリセットする可能性があります。
|
||||
|
||||
Yii のセキュリティヘルパは擬似乱数データの生成を単純な作業にしてくれます。
|
||||
|
||||
|
||||
```php
|
||||
$key = Yii::$app->getSecurity()->generateRandomString();
|
||||
```
|
||||
|
||||
暗号論的に安全な乱数データを生成するためには、`openssl` 拡張をインストールしている必要があることに注意してください。
|
||||
|
||||
暗号化と復号化
|
||||
--------------
|
||||
|
||||
Yii は秘密鍵を使ってデータを暗号化/復号化することを可能にする便利なヘルパ関数を提供しています。
|
||||
データを暗号化関数に渡して、秘密鍵を持つ者だけが復号化することが出来るようにすることが出来ます。
|
||||
例えば、何らかの情報をデータベースに保存する必要があるけれども、(たとえアプリケーションのデータベースが第三者に漏洩した場合でも) 秘密鍵を持つユーザだけがそれを見ることが出来るようにする必要がある、という場合には次のようにします。
|
||||
|
||||
```php
|
||||
// $data と $secretKey はフォームから取得する
|
||||
$encryptedData = Yii::$app->getSecurity()->encryptByPassword($data, $secretKey);
|
||||
// $encryptedData をデータベースに保存する
|
||||
```
|
||||
|
||||
そして、後でユーザがデータを読みたいときは、次のようにします。
|
||||
|
||||
```php
|
||||
// $secretKey はユーザ入力から取得、$encryptedData はデータベースから取得
|
||||
$data = Yii::$app->getSecurity()->decryptByPassword($encryptedData, $secretKey);
|
||||
```
|
||||
|
||||
データの完全性を確認する
|
||||
------------------------
|
||||
|
||||
データが第三者によって改竄されたり、更には何らかの形で毀損されたりしていないことを確認する必要がある、という場合があります。
|
||||
Yii は二つのヘルパ関数の形で、データの完全性を確認するための簡単な方法を提供しています。
|
||||
|
||||
秘密鍵とデータから生成されたハッシュをデータにプレフィクスします。
|
||||
|
||||
```php
|
||||
// $secretKey はアプリケーションまたはユーザの秘密、$genuineData は信頼できるソースから取得
|
||||
$data = Yii::$app->getSecurity()->hashData($genuineData, $secretKey);
|
||||
```
|
||||
|
||||
データの完全性が毀損されていないかチェックします。
|
||||
|
||||
```php
|
||||
// $secretKey はアプリケーションまたはユーザの秘密、$data は信頼できないソースから取得
|
||||
$data = Yii::$app->getSecurity()->validateData($data, $secretKey);
|
||||
```
|
||||
|
||||
|
||||
todo: XSS prevention, CSRF prevention, cookie protection, refer to 1.1 guide
|
||||
|
||||
プロパティを設定することによって、CSRF バリデーションをコントローラ および/または アクション単位で無効にすることも出来ます。
|
||||
|
||||
```php
|
||||
namespace app\controllers;
|
||||
|
||||
use yii\web\Controller;
|
||||
|
||||
class SiteController extends Controller
|
||||
{
|
||||
public $enableCsrfValidation = false;
|
||||
|
||||
public function actionIndex()
|
||||
{
|
||||
// CSRF バリデーションはこのアクションおよびその他のアクションに適用されない
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
特定のアクションに対して CSRF バリデーションを無効にするためには、次のようにします。
|
||||
|
||||
```php
|
||||
namespace app\controllers;
|
||||
|
||||
use yii\web\Controller;
|
||||
|
||||
class SiteController extends Controller
|
||||
{
|
||||
public function beforeAction($action)
|
||||
{
|
||||
// ... ここで、何らかの条件に基づいて `$this->enableCsrfValidation` をセットする ...
|
||||
// 親のメソッドを呼ぶ。プロパティが true なら、その中で CSRF がチェックされる。
|
||||
return parent::beforeAction($action);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
クッキーを安全にする
|
||||
--------------------
|
||||
|
||||
- validation
|
||||
- httpOnly is default
|
||||
|
||||
参照
|
||||
----
|
||||
|
||||
以下も参照してください。
|
||||
|
||||
- [ビューのセキュリティ](structure-views.md#security)
|
||||
|
||||
|
||||
@@ -203,7 +203,7 @@ server {
|
||||
|
||||
location / {
|
||||
# 本当のファイルでないものは全て index.php にリダイレクト
|
||||
try_files $uri $uri/ /index.php?$args;
|
||||
try_files $uri $uri/ /index.php$is_args$args;
|
||||
}
|
||||
|
||||
# 存在しない静的ファイルの呼び出しを Yii に処理させたくない場合はコメントを外す
|
||||
@@ -214,7 +214,7 @@ server {
|
||||
|
||||
location ~ \.php$ {
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
fastcgi_pass 127.0.0.1:9000;
|
||||
#fastcgi_pass unix:/var/run/php5-fpm.sock;
|
||||
try_files $uri =404;
|
||||
|
||||
Reference in New Issue
Block a user