Phalcon-security-features

提供:Dev Guides
移動先:案内検索

Phalcon-セキュリティ機能

Phalconは、セキュリティコンポーネントを使用してセキュリティ機能を提供します。これは、パスワードハッシュや Cross-Site Request Forgery (CSRF)などの特定のタスクの実行に役立ちます。

パスワードのハッシュ化

  • ハッシュ*は、固定長のビット文字列を、元に戻せないように指定された長さに変換するプロセスとして定義できます。 入力文字列を変更すると、ハッシュされたデータの値が変更されます。

ハッシュされたデータの復号化は、ユーザーが入力した値を入力として受け取り、そのハッシュ形式を比較することにより行われます。 通常、Webベースのアプリケーションでは、パスワードをプレーンテキストとして保存するのは悪い習慣です。 データベースにアクセスできるユーザーは、任意のユーザーのパスワードを簡単に入手できるため、サードパーティの攻撃を受けやすくなります。

Phalconは、 md5、base64 、または sh1 などのアルゴリズムに従う暗号化された形式でパスワードを保存する簡単な方法を提供します。

前の章で見たように、ブログ用のプロジェクトを作成しました。 ログイン画面は、ユーザーのユーザー名とパスワードとして入力を受け入れます。 ユーザーからパスワードを受け取り、特定の形式でパスワードを復号化するには、次のコードスニペットが使用されます。

復号化されたパスワードは、ユーザーからの入力として受け入れられたパスワードと照合されます。 値が一致する場合、ユーザーはWebアプリケーションに正常にログインできます。それ以外の場合は、エラーメッセージが表示されます。

<?php
class UsersController extends Phalcon\Mvc\Controller {
   public function indexAction() {
   }
   public function registerUser() {
      $user = new Users();
      $login    = $this->request->getPost("login");
      $password = $this->request->getPost("password");
      $user->login = $login;

     //Store the hashed pasword
      $user->password = $this->security->sh1($password);
      $user->save();
   }
   public function loginAction() {
      if ($this->request->isPost()) {
         $user = Users::findFirst(array(
            'login = :login: and password = :password:',
            'bind' => array(
               'login' => $this->request->getPost("login"),
               'password' => sha1($this->request->getPost("password"))
            )
         ));
         if ($user === false) {
            $this->flash->error("Incorrect credentials");
            return $this->dispatcher->forward(array(
               'controller' => 'users',
               'action' => 'index'
            ));
         }
         $this->session->set('auth', $user->id);
         $this->flash->success("You've been successfully logged in");
      }
      return $this->dispatcher->forward(array(
         'controller' => 'posts',
         'action' => 'index'
      ));
   }
   public function logoutAction() {
      $this->session->remove('auth');
      return $this->dispatcher->forward(array(
         'controller' => 'posts',
         'action' => 'index'
      ));
   }
}

データベースに保存されているパスワードは、暗号化された sh1 アルゴリズムの形式です。

パスワード

ユーザーが適切なユーザー名とパスワードを入力すると、ユーザーはシステムにアクセスできます。そうでない場合、検証としてエラーメッセージが表示されます。

検証

クロスサイトリクエストフォージェリ(CSRF)

これは、Webアプリケーションの認証されたユーザーに特定の不要なアクションを実行させる攻撃です。 ユーザーからの入力を受け付けるフォームは、この攻撃に対して脆弱です。 Phalconは、アプリケーション外部のフォームを介して送信されるデータを保護することにより、この攻撃を防止しようとします。

各フォームのデータは、トークン生成を使用して保護されます。 生成されたトークンはランダムであり、フォームデータの送信先のトークンと一致します(ほとんどはPOSTメソッドを介してWebアプリケーションの外部にあります)。

コード:

<?php echo Tag::form('session/login') ?>
   <!-- Login and password inputs ... -->
   <input type = "hidden" name = "<?php echo $this->security->getTokenKey() ?>"
      value = "<?php echo $this->security->getToken() ?>"/>
</form>

-すべてのデータはセッションで保持されるため、フォームのトークンを送信するときにセッションアダプターを使用することが重要です。

次のコードを使用して、セッションアダプタを services.php に含めます。

/* *
  * Start the session the first time some component request the session service
*/

$di->setShared('session', function () {
   $session = new SessionAdapter();
   $session->start();
   return $session;
});