From 1966f1feedd92d38c67abd93b6d59c79ffabd6e0 Mon Sep 17 00:00:00 2001 From: Nobuo Kihara Date: Fri, 23 Mar 2018 10:20:42 +0900 Subject: [PATCH] docs/guide-ja minor updates --- docs/guide-ja/caching-overview.md | 13 ++++++------ docs/guide-ja/caching-page.md | 2 +- docs/guide-ja/concept-behaviors.md | 4 ++-- docs/guide-ja/concept-service-locator.md | 2 ++ docs/guide-ja/db-active-record.md | 21 +++++++++++++++++++ docs/guide-ja/db-query-builder.md | 26 +++++++++++++++++++++++- 6 files changed, 58 insertions(+), 10 deletions(-) diff --git a/docs/guide-ja/caching-overview.md b/docs/guide-ja/caching-overview.md index 2420083fb9..f0f57d727b 100644 --- a/docs/guide-ja/caching-overview.md +++ b/docs/guide-ja/caching-overview.md @@ -1,13 +1,14 @@ キャッシュ -======= +========== -ウェブアプリケーションのパフォーマンスを向上させるための簡単で効果的な方法としてキャッシュというものがあります。 -比較的静的なデータをキャッシュに格納し、要求に応じてキャッシュからそれらを取得することによって、アプリケーションは毎回一からデータを生成するのに必要な時間を節約することができます。 +キャッシュはウェブアプリケーションのパフォーマンスを向上させるための安価で効果的な方法です。 +比較的静的なデータをキャッシュに格納し、要求に応じてキャッシュからそれを取得します。 +これによって、アプリケーションは、毎回一からデータを生成した場合に必要になるであろう時間を節約することができます。 キャッシュはアプリケーション内のさまざまなレベルと場所で使用することができます。 -例えばサーバサイドでの低いレベルでは、データベースから取得した最新の記事情報リストのような基本的なデータを格納するために使用することが出来ます。 -高いレベルでは、ウェブページの断片または全体、例えば、最新の記事のレンダリング結果を格納するために使用することが出来ます。 -クライアントサイドでは、ブラウザのキャッシュに最近訪れたことのあるページの内容を格納するために HTTP キャッシュを使用することもできます。 +例えばサーバサイドでの低いレベルでは、データベースから取得した最新の記事情報リストのような基本的なデータを格納するためにキャッシュを使用することが出来ます。 +より高いレベルでは、ウェブページの断片または全体、例えば、最新の記事のレンダリング結果を格納するためにキャッシュを使用することが出来ます。 +クライアントサイドでは、最近訪れたページの内容をブラウザのキャッシュに格納するために、HTTP キャッシュを使用することができます。 Yii はこれら全てのキャッシュ機構をサポートしています: diff --git a/docs/guide-ja/caching-page.md b/docs/guide-ja/caching-page.md index cbae7d8708..5eb22e1b3d 100644 --- a/docs/guide-ja/caching-page.md +++ b/docs/guide-ja/caching-page.md @@ -1,7 +1,7 @@ ページキャッシュ ================ -ページキャッシュはサーバサイドでページ全体のコンテントをキャッシュすることを言います。あとで、同じページに再度リクエストがあった場合、その内容を一から再び生成させるのではなく、キャッシュから提供するようにします。 +ページキャッシュはサーバサイドでページ全体のコンテントをキャッシュすることを言います。後で再び同じページがリクエストされた場合に、その内容を一から生成するのではなく、キャッシュから提供するようにします。 ページキャッシュは [[yii\filters\PageCache]] という [アクションフィルタ](structure-filters.md) によってサポートされています。これは、コントローラクラスで以下のように使用することができます: diff --git a/docs/guide-ja/concept-behaviors.md b/docs/guide-ja/concept-behaviors.md index 403300c350..341def9cbd 100644 --- a/docs/guide-ja/concept-behaviors.md +++ b/docs/guide-ja/concept-behaviors.md @@ -1,7 +1,7 @@ ビヘイビア -========= +========== -ビヘイビアは [[yii\base\Behavior]] 、あるいはその子クラスのインスタンスです。ビヘイビアは +ビヘイビアは [[yii\base\Behavior]] またその子クラスのインスタンスです。ビヘイビアは [ミックスイン](http://en.wikipedia.org/wiki/Mixin) としても知られ、既存の [[yii\base\Component|component]] クラスの 機能を、クラスの継承を変更せずに拡張することができます。コンポーネントにビヘイビアをアタッチすると、その コンポーネントにはビヘイビアのメソッドとプロパティが "注入" され、それらのメソッドとプロパティは、 diff --git a/docs/guide-ja/concept-service-locator.md b/docs/guide-ja/concept-service-locator.md index 0b9ecf584d..d780390b1f 100644 --- a/docs/guide-ja/concept-service-locator.md +++ b/docs/guide-ja/concept-service-locator.md @@ -123,3 +123,5 @@ return [ モジュールからサービスを引き出そうとする全てのリクエストは、そのモジュールが要求に応じられない場合は、すべてその親に渡されます。 +モジュール内のコンポーネントの構成情報は、親モジュール内のコンポーネントの構成情報とは決してマージされないことに注意して下さい。 +サービスロケータパターンによって私たちは名前の付いたサービスを定義することが出来ますが、同じ名前のサービスが同じ構成パラメータを使用すると想定することは出来ません。 diff --git a/docs/guide-ja/db-active-record.md b/docs/guide-ja/db-active-record.md index 82dbdbdda9..2b1a9a9a04 100644 --- a/docs/guide-ja/db-active-record.md +++ b/docs/guide-ja/db-active-record.md @@ -209,6 +209,27 @@ $customers = Customer::findAll([ ]); ``` +> Warning: これらのメソッドにユーザ入力を渡す必要がある場合は、入力値がスカラ値であること、または、 +> 入力値が配列形式の条件である場合は配列の構造が外部から変更され得ないことを保証して下さい。 +> +> ```php +> // yii\web\Controller が $id はスカラ値であることを保証しています +> public function actionView($id) +> { +> $model = Post::findOne($id); +> // ... +> } +> +> // 検索するカラムを明示的に指定する場合。 +> // ここでは、どんなスカラ値または配列を渡しても、単一のレコードを発見する結果になります。 +> $model = Post::findOne(['id' => Yii::$app->request->get('id')]); +> +> // 次のコードを使用してはいけません! +> // 配列形式の条件を挿入されて、任意のカラムの値による検索を実行される可能性があります! +> $model = Post::findOne(Yii::$app->request->get('id')); +> ``` + + > Note: [[yii\db\ActiveRecord::findOne()]] も [[yii\db\ActiveQuery::one()]] も、生成される SQL 文に `LIMIT 1` を追加しません。 あなたのクエリが多数のデータ行を返すかもしれない場合は、パフォーマンスを向上させるために、`limit(1)` を明示的に呼ぶべきです。 例えば `Customer::find()->limit(1)->one()` のように。 diff --git a/docs/guide-ja/db-query-builder.md b/docs/guide-ja/db-query-builder.md index bcf946c576..97b40ae826 100644 --- a/docs/guide-ja/db-query-builder.md +++ b/docs/guide-ja/db-query-builder.md @@ -181,7 +181,7 @@ $query->where('YEAR(somedate) = 2015'); $query->where("status=$status"); ``` -パラメータバインディングを使う場合は、[[yii\db\Query::params()|params()]] または [[yii\db\Query::addParams()|addParams()]] を使って、パラメータの指定を分離することが出来ます。 +`パラメータバインディング` を使う場合は、[[yii\db\Query::params()|params()]] または [[yii\db\Query::addParams()|addParams()]] を使って、パラメータの指定を分離することが出来ます。 ```php $query->where('status=:status') @@ -220,7 +220,19 @@ $query->where(['id' => $userQuery]); ハッシュ形式を使う場合、Yii は内部的にパラメータバインディングを使用します。 従って、[文字列形式](#string-format) とは対照的に、ここでは手動でパラメータを追加する必要はありません。 +ただし、Yii はカラム名を決してエスケープしないことに注意して下さい。 +従って、ユーザから取得した変数を何ら追加のチェックをすることなくカラム名として渡すと、SQL インジェクション攻撃に対して脆弱になります。 +アプリケーションを安全に保つためには、カラム名として変数を使わないこと、または、変数をホワイトリストによってフィルターすることが必要です。 +カラム名をユーザから取得する必要がある場合は、ガイドの [データをフィルタリングする](output-data-widgets.md#filtering-data) という記事を読んで下さい。 +例えば、次のコードは脆弱です。 +```php +// 脆弱なコード: +$column = $request->get('column'); +$value = $request->get('value); +$query->where([$column => $value]); +// $value は安全です。しかし、$column の名前はエンコードされません。 +``` #### 演算子形式 @@ -292,7 +304,19 @@ $query->where(['id' => $userQuery]); 演算子形式を使う場合、Yii は内部的にパラメータバインディングを使用します。 従って、[文字列形式](#string-format) とは対照的に、ここでは手動でパラメータを追加する必要はありません。 +ただし、Yii はカラム名を決してエスケープしないことに注意して下さい。 +従って、ユーザから取得した変数を何ら追加のチェックをすることなくカラム名として渡すと、SQL インジェクション攻撃に対して脆弱になります。 +アプリケーションを安全に保つためには、カラム名として変数を使わないこと、または、変数をホワイトリストによってフィルターすることが必要です。 +カラム名をユーザから取得する必要がある場合は、ガイドの [データをフィルタリングする](output-data-widgets.md#filtering-data) という記事を読んで下さい。 +例えば、次のコードは脆弱です。 +```php +// 脆弱なコード: +$column = $request->get('column'); +$value = $request->get('value); +$query->where([$column => $value]); +// $value は安全です。しかし、$column の名前はエンコードされません。 +``` #### オブジェクト形式