top


総投稿数 本 
no_

スポンサーサイト

 --------
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
カテゴリ :スポンサー広告 トラックバック(-) コメント(-)
no_1194

ログイン処理:symfonyなどのフレームワークが使えないプロジェクト。さて、セキュアなログイン処理をもう一度学びなおして実装するか ・・・ 【サイト構築】

 2009-12-24
 おぉ・・・街はクリスマス、だ。

 あるプロジェクト。
 基礎的なデザインが終わって、これから
 コーディングに入る。
 ・symfonyCakePHP などのフレームワーク
  が使えない。
 いつものように、また、ガリガリ書くことになる。


 まずは、ログイン処理 からだ。
 せっかくだから、セキュアなログイン処理
 もう一度学びなおして、丁寧に創ってゆこ。
 (でも結局は、Pear のお世話になるのだけれど)


  追記に (長文ご容赦) ▼


 ところで、こちらは・・・
◇今日のGoogle(2009/12/23)
今日のGoogle(2009/12/23)
 ハッピーホリデー。
 ふふふ、シリーズものだったのですね。
ふふふ、シリーズものだったのですね
 やられた。

FC2ブログランキング にほんブログ村 IT技術ブログ Webサイト構築へ ブログ王ランキング 人気ブログランキング 人気ホームページランキングへ


more

************************************************
◎ セキュアなログイン処理
  :サイト構築

************************************************


 基本的な流れはわかる。
 (php で実装する場合)
  ※もう、何度か構築したのだけど


  □セッションを利用する
  □アカウント、パスワードを得て
   データベースの登録ユーザーとのマッチング
   □該当あれば、
    ・ログイン状態にして
    ・★セッションで値を保持
   □なければ、アラート


 だが、この
    ・★セッションで値を保持
     というところで、 よくセキュリティ的な示唆
     含んだ情報を目にする。
 各記事を読み直して、ポイントをまとめておく。


 まずこの記事が非常に参考になった。ありがとうございます。


なぜPHPアプリにセキュリティホールが多いのか?
なぜPHPアプリにセキュリティホールが多いのか?※引用転載
 【スクリプトインジェクション対策18】
 ログイン処理を正しく実装する



 気になる方は詳しく参照していただくとして、
【ポイント】※素直に参照させていただき、
  □ログインページが
   スクリプトインジェクションに脆弱であるのは論外
   >> スクリプトインジェクション:wikipedia
  □ログインに成功した場合,
   □新しいセッションIDを割り当てるべき
   (セッションIDの盗聴や固定化などから防御)
  □ログオフ の重要性
   ・判り易い位置。確実なログオフ。
   □ログオフ後
    ・セッションIDとセッション情報は破棄
  □ログの必要性
   ・過去数回のログイン履歴も参照できる
   □IPアドレス や ホストのログ記録
  □自動ログイン
   □自動ログイン用の鍵となるクッキーをパス付きで保管
    □鍵には必ず十分に長いランダムな文字列
     (/dev/urandomを利用したSHA1ハッシュなど)
     を利用
    □ログインのたびに新しい鍵を設定
    □一度使った鍵は無効となるように
     データベース等から削除
   □BASIC認証は非常に危険な認証方式
   □固定や固定に近い自動ログインキーは
    絶対に使用してはならぬ。
  □JavaScriptが有効なクライアント
   □チャレンジレスポンス型の認証
   >> チャレンジ/レスポンス認証:e-Words
   >> [図解]チャレンジレスポンス方式

【参考例】
 □チャレンジレスポンス型の認証
  ※PHPやjavascriptでのサンプルもいくつかありますね。
   >> PHP: Writing A Generic Login And Register Script
   >> Challenge/Response Secure Login Process
   >> PHP - Implementing Secure Login with PHP, JavaScript, and Sessions (without SSL)
   >> A Challenge-Response Ajax PHP Login System


 他にも参考になる記事がたくさんあった。ほんに有難し。
   ◆解答:まちがった自動ログイン処理
   ◆PHPでOpenIDによるログイン処理


 ・・・ さてと ・・・
 で、お前はどうしたか? と聞かれると、


 ・・・ PEAR::Auth のお世話になってしまいました!
    (チャレンジレスポンス型の認証 は
     Auth::setAdvancedSecurity() があるし。)

 私の本業が、真のプログラマで無いこともありますが
 これら情報を一応咀嚼し、それぞれの大まかな概念を
 掴んだうえで、利用する分には、いいんじゃないのかな、と。


 甘い!? ・・・ そう、甘いんです。
 だって、こんなに揃ってんだもの・・・
   >> PHP・PEAR: Manual :: Auth


Authについてのチュートリアル
Authについてのチュートリアル※引用転載
 簡単な認証機構を利用してシステムを構築し、
 サイトをセキュアにすることを目標



 これまた、丁寧な解説ですねぇ。
タイトル改変。

************************************************
◎ Pear/Auth を利用した、セキュアなログイン処理
  :サイト構築

************************************************


 


 さて、実装。
 ■まず、現サーバーの Pearの確認。
 一応用意されているはずだ。SSHコマンドで、
$ pear
Commands:
build Build an Extension From C Source
bundle Unpacks a Pecl Package
channel-add Add a Channel
・・・・・
 ずらずら出てきます。OK。
$ pear config-get php_dir
/usr/share/pear
 こちらですね。さらに、
$ php -c /path/to/php.ini -r 'echo get_include_path()."\n";'
.:/usr/share/pear:/usr/share/php
 了解。

 デフォルトでは、
# pear list
Installed packages, channel pear.php.net:
=========================================
Package Version State
Archive_Tar 1.3.3 stable
Cache_Lite 1.7.8 stable
Config 1.10.11 stable
・・・・・
 入っていないようなので、
# pear install Auth-1.6.2
・・・・・
WARNING: "pear/DB" is deprecated in favor of "pear/MDB2"
WARNING: "pear/MDB" is deprecated in favor of "pear/MDB2"
・・・・・
 いろいろ Wanring
 今入っている、MDB2 を使ったほうが
 いいのだろうけど、Authで標準で利用される
 PEAR::DB も組み込む。
# pear install DB
WARNING: "pear/DB" is deprecated in favor of "pear/MDB2"
downloading DB-1.7.13.tgz ...
Starting to download DB-1.7.13.tgz (132,246 bytes)
.............................done: 132,246 bytes
install ok: channel://pear.php.net/DB-1.7.13

 一応、OKの模様。
# pear list
Installed packages, channel pear.php.net:
=========================================
Package Version State
Archive_Tar 1.3.3 stable
Auth 1.6.2 stable
Cache_Lite 1.7.8 stable
Config 1.10.11 stable
Console_Getopt 1.2.3 stable
DB 1.7.13 stable
・・・・・

 


 ■コンストラクタ の確認(※>> コンストラクタ:wikipedia
Auth::Auth ( mixed $storageDriver 
, mixed $options = ""
, string $loginFunction = ""
, boolean $showLogin = = true )
 ・string $storageDriver
  使用すべきストレージドライバーの名前、
  もしくは独自の Auth_Container オブジェクト
 ・mixed $options
  Auth 自身およびストレージドライバの両方についての
  オプションを含む配列。
 ・string $loginFunction
  ログイン画面を表示するユーザ定義関数の名前。
 ・boolean $showLogin
  ログインがオプションかどうかの定義

 


 ■本実装
  ・PEAR::Auth を利用するために・・・
<? require_once "Auth/Auth.php"; ?>
 ・・・なんか、require_once "Auth.php"; でもいいようだけど。

 


 ■ログイン用function 準備
  ・常に表示するわけではない
  ・トリガの有無を確認するためのフラグを付加。
<?
function loginFunction($username, $status){
print("<form method=\"post\" action=\"./\" name=\"formlogin\" id=\"formlogin\">");
print("<p class='loginarea'>");
print("アカウント :");
print("<input type=\"text\" name=\"username\" class=\"logininput\" id=\"logininput\" value=\"ご登録されたID\"><br />");
print("パスワード :");
print("<input type=\"password\" name=\"password\" class=\"loginpass\" id=\"loginpass\" value=\"**********\"><br />");
print("<input type=\"hidden\" name=\"logingo\" id=\"logingo\" value=\"\">");
print("</p>");
print("<input type=\"submit\" name=\"btlogingo\" id=\"btlogingo\" value=\"ログイン\">");
print("</form>");
} ?>

 


 ■コンストラクタで利用する
  パラメータ配列の準備。
<?
$params = array(
"dsn" => "mysqli://(acname):(acpass)@localhost/(dbname)",
"table" => "(tablename)",
"usernamecol" => "(username)",
"passwordcol" => "(password)",
"cryptType" => "md5"
# "db_options" => array("portability" => MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_FIX_CASE)
);
# ()は、当該値に変更 ?>
 他にも指定できるオプションあるね。

 


 ■通常アクセスは、認証のみ
  ※フォームを表示しない ・・・ から、
<?
$SYS_VALS['logined']=-1;
$optional = false; # としておいて
$auth = new Auth("DB", $params,"loginFunction",$optional);
$auth->setSessionName('(sesiisonname)');
$auth->setadvancedsecurity('true');
$auth->start();
# ()は、当該値に変更

if ($auth->getAuth()){
print("認証されている。<br />"); $SYS_VALS['logined']=1;
} ?>

 


 ■ログインは、別頁ではなく
  すべての頁に
  ・ログインされ(認証され)てなければ、表示させるので、
<?	if($SYS_VALS['logined']==1){ ?>
# ログインされた場合の処理
<? }else{ $optional = true;
$auth = new Auth("DB", $params,"loginFunction",$optional);
$auth->setSessionName('(sesiisonname)');
$auth->setadvancedsecurity('true');
$auth->start();
} ?>

 ひとまずここまで。


 次は、認証はハッシュ化されたパスワードで行うので、
 先に、「新規登録」処理を作成し、テストデータを
 パスワード暗号化し登録する部分 ・・・ だな。

commentsコメント
comment_post












管理者にだけ表示を許可する
commentトラックバック
トラックバックURL:
http://metaboy.blog23.fc2.com/tb.php/1194-a19f4c8c
ようこそ
Add to Google 創るmetaboy:RSSフィード
My Yahoo!に追加
最新記事のRSS | 問い合わせ

仕事検索、アルバイト検索、依頼仕事の検索ポータル - 仕事検索.COM - www.jobkensaku.com ツクルン

創るmetaboy - WEB創る、サイト創る、何創る - 創ったmetaboy

 

リンク集

 

最近の記事

 

ブロとも申請フォーム
Sponserd by

さくらのレンタルサーバ さくらのレンタルサーバ
大容量・高機能レンタルサーバー heteml 大容量・高機能レンタルサーバー heteml
XREA (ValueDomain)
お名前.com お名前.com
名づけてねっと名づけてねっと
ムームードメインムームードメイン

 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。