Cakephp-security
CakePHP-セキュリティ
セキュリティは、Webアプリケーションを構築する際のもう1つの重要な機能です。 Webサイトのユーザーに、データが保護されていることを保証します。 CakePHPは、アプリケーションを保護するためのいくつかのツールを提供します。
暗号化と復号化
CakePHPのセキュリティライブラリは、データを暗号化および復号化できるメソッドを提供します。 以下は、同じ目的で使用される2つの方法です。
static Cake\Utility\Security::encrypt($text, $key, $hmacSalt = null)
static Cake\Utility\Security::decrypt($cipher, $key, $hmacSalt = null)
暗号化メソッドは、データを暗号化するための引数としてテキストとキーを受け取り、戻り値はHMACチェックサム付きの暗号化された値になります。
データをハッシュするにはhash()メソッドが使用されます。 hash()メソッドの構文は次のとおりです。
構文
static Cake\Utility\Security::hash($string, $type = NULL, $salt = false)
CSRF
CSRFは Cross Site Request Forgery の略です。 CSRFコンポーネントを有効にすると、攻撃に対する保護が得られます。 CSRFは、Webアプリケーションの一般的な脆弱性です。 これにより、攻撃者は以前のリクエストをキャプチャしてリプレイし、場合によっては他のドメインのイメージタグまたはリソースを使用してデータリクエストを送信できます。 CSRFは、以下に示すように、 CsrfComponent をコンポーネント配列に追加するだけで有効にできます。
public function initialize(){
parent::initialize();
$this->loadComponent('Csrf');
}
CsrfComponentは FormHelper とシームレスに統合します。 FormHelperでフォームを作成するたびに、CSRFトークンを含む非表示フィールドが挿入されます。
これは推奨されませんが、特定の要求でCsrfComponentを無効にすることができます。 そのためには、* beforeFilter()メソッド*の間にコントローラーのイベントディスパッチャーを使用します。
public function beforeFilter(Event $event){
$this->eventManager()->off($this->Csrf);
}
セキュリティコンポーネント
セキュリティコンポーネントは、アプリケーションにより厳しいセキュリティを適用します。 次のようなさまざまなタスクのメソッドを提供します-
- アプリケーションが受け入れるHTTPメソッドの制限-副作用を実行する前に、使用されているHTTPメソッドを常に確認する必要があります。 HTTPメソッドを確認するか、* Cake \ Network \ Request :: allowMethod()*を使用して、正しいHTTPメソッドが使用されていることを確認してください。
- フォーム改ざん保護-デフォルトでは、SecurityComponentはユーザーが特定の方法でフォームを改ざんすることを防ぎます。 SecurityComponentは、次のことを防ぎます-
- 不明なフィールドはフォームに追加できません。
- フォームからフィールドを削除することはできません。
- 非表示の入力の値は変更できません。
- * SSLを使用する必要があります*-SSLで保護する必要があるすべてのアクション。
- コントローラ間通信の制限-このコントローラにリクエストを送信できるコントローラを制限できます。 また、このコントローラーのアクションにリクエストを送信できるアクションを制限することもできます。
例
次のプログラムに示すように、 config/routes.php ファイルに変更を加えます。
*config/routes.php*
<?php
use Cake\Core\Plugin;
use Cake\Routing\RouteBuilder;
use Cake\Routing\Router;
Router::defaultRouteClass('DashedRoute');
Router::scope('/', function (RouteBuilder $routes) {
$routes->connect('login',['controller'=>'Logins','action'=>'index']);
$routes->fallbacks('DashedRoute');
});
Plugin::routes();
*src/Controller/LoginsController.php* に *LoginsController.php* ファイルを作成します。 次のコードをコントローラーファイルにコピーします。
*src/Controller/LoginsController.php*
<?php
namespace App\Controller;
use App\Controller\AppController;
class LoginsController extends AppController{
public function initialize(){
parent::initialize();
$this->loadComponent('Security');
}
public function index(){
}
}
?>
*src/Template* にLoginsディレクトリを作成し、そのディレクトリの下に *index.ctp* という *View* ファイルを作成します。 そのファイルに次のコードをコピーします。
*src/Template/Logins/index.ctp*
<?php
echo $this->Form->create("Logins",array('url'=>'/login'));
echo $this->Form->input('username');
echo $this->Form->input('password');
echo $this->Form->button('Submit');
echo $this->Form->end();
?>
次のURLにアクセスして、上記の例を実行します-* http://localhost:85/CakePHP/login *
出力
実行すると、次の出力が表示されます。