PHPプログラムに関する各種メモ書き:タグ「セッション」での検索

CodeIgniterの簡易パスワード認証ライブラリ Minimal_auth.php

CodeIgniterで開発中にあるクラスだけパスワード認証をかけたい、または簡易なログイン画面を付けたい場合があります。
その時は以下のライブラリ【Minimal_auth.php】を用意するといいでしょう。
CodeIgniterのセッションを利用して超簡易パスワード認証をつけることができます。
SHA-256でハッシュしていますので、Basic認証、Digest認証の代わりにどうぞ。
またロボット対策として動的にhiddenを生成して送っています。

1. application/libraries``` にファイル名Minimal_auth.php` として保存

<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');

class Minimal_auth {
  private $CI;
  private $_login_flag = false;

  public function __construct(){
    $this->CI =& get_instance();
		$this->CI->config->load('minimal_auth');
    $this->CI->load->library('session');
  }

  public function view_login($flag=''){
    $sess = $this->CI->session->all_userdata();
    $err_mess = '';
    if (strcmp($flag,'error')==0){
      $err_mess = 'ログインエラーです。';
    }
    print <<< DOC_END
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/sha256.js"></script>
<script>
function make_hidden(e,n,d){var m=document.createElement("input");m.type="hidden",m.name=e,m.value=n,d?document.forms[d].appendChild(m):document.forms[0].appendChild(m)}
</script>
<style type="text/css">
*{
  font-size:12px;
  font-family: serif;
}
</style>
</head>
<body>
{$err_mess}
<form method="post" action="{$sess['login_url']}" onsubmit="return false;" >
<h1>パスワードを入力してください。</h1>
<input type="password" id="in_text" name="in_text">
<input type="button" value="送信" onclick="var v = document.getElementById('in_text').value; v = CryptoJS.SHA256(v); make_hidden('apb',v); document.getElementById('in_text').value=''; this.form.submit();">
</form>
</body>
</html>
DOC_END;
  }

  public function login_submit(){
    $password_sha256 = hash( 'sha256', $this->CI->config->item('admin_password') );
    if (strcmp($password_sha256, $this->CI->input->post('apb') )==0 && ( strcmp($this->CI->input->post('apb'),'') != 0 ) ){
      $sess = $this->CI->session->all_userdata();
      $session['_login_flag']  = true;
      $this->CI->session->set_userdata($session);
      redirect( $sess['jump_to'] );
      exit();
    }
    else{
      $this->view_login('error');
      exit();
    }
  }

  public function login( $login_url, $jump_to ){
    $sess = $this->CI->session->all_userdata();
      if ( @$sess['_login_flag']  == true ){
        return;
      }
    elseif ( preg_match('/login_submit/', uri_string() ) ){
      $this->login_submit();
    }
    else{
      $session['login_url']    = $login_url;
      $session['jump_to']      = $jump_to;
      $session['_login_flag']  = false;
      $this->CI->session->set_userdata($session);
      $this->view_login($login_url);
      exit();
    }
  }

}

2. application/config``` にファイル名minimal_auth.php` として保存

<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
$config['admin_password'] = 'hogehoge';// パスワード(適宜変更すること)

3. 認証を付けたいコントローラー(例: `application/controllers/Admin.php`) に以下を追加

	public function __construct(){
		// コンストラクタに以下の2行を追加
		$this->load->library('minimal_auth');
		$this->minimal_auth->login( site_url("admin/login_submit"), (empty($_SERVER["HTTPS"]) ? "http://" : "https://") . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] );
	}

	// 以下のメソッドを追加(中身は空でいいです。 クラス名やメソッド名を変更した場合は上の「admin/login_submit」も変更すること)
	public function login_submit(){
	}

以上で /index.php/admin/ 以下の任意のメソッドにパスワード認証がつきます。
なおパスワード有効期間はセッション有効期間ですので

```
$config['sess_expiration'] = 60*60*24;	// セッションを終了させたい秒(例:24時間)。
$config['sess_save_path'] = APPPATH.'session';	// セッション保存ディレクトリ(例:application/session/)。
$config['sess_match_ip'] = TRUE;	// セッションのIPアドレス照合(例:照合する)。
$config['sess_time_to_update'] = 60*5;	// セッションID更新秒(例:5分)。
```
No.958
10/16 17:12

edit

CodeIgniter
セッション

セッション使用時のブラウザキャッシュの動作を制御する

PHPでセッションを使用する

session_start();

とすると、ブラウザのHTTPヘッダには

Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

というのが必ず送られます。

これが送られるとそのページはキャッシュされないので、例えばフォーム入力画面の場合

次の確認画面から history.back(); で返ってくると、入力欄が消えてしまいます。

そこで

■ 方法1.

session_cache_limiter('none'); // no-cacheヘッダを送信しない
session_start();

とするか、

■ 方法2

session_cache_limiter('public'); // セッション使用時にキャッシュを使えるようにする
// ↓PHPのデフォルト値は 180 です
session_cache_expire(60); // セッション時のキャッシュ有効時間 60分(1時間)
session_start();

とすると、セッション使用時にもキャッシュ可能になります。

ちなみにセッション自体の有効時間は

ini_set("session.cookie_lifetime", 28800); // セッション有効時間 60*60*8(8時間)

として指定します。

session_cache_limiterの引数

none : no-cacheヘッダを送信しない
nocache : no-cacheヘッダを送信する
private : キャッシュを利用する(プロキシサーバーにはキャッシュを利用させない)
private_no_expire : キャッシュを利用する(プロキシサーバーにはキャッシュを利用させない)
public : キャッシュを利用する

No.680
02/08 15:39

edit

Cookie
セッション

Smartyでセッション変数、cookie、環境変数を参照する

Smartyテンプレート内でセッション変数、cookie、環境変数の値を参照したいときは下記のようにします。

phpのセッション変数"id"の値を表示

{$smarty.session.id}

クッキーに登録された"username"の値を表示

{$smarty.cookies.username}

環境変数"PATH"の値を表示

{$smarty.env.PATH}

環境変数 "SERVER_NAME" の値を表示

{$smarty.server.SERVER_NAME}

環境変数 "HTTP_USER_AGENT" の値を表示

{$smarty.server.HTTP_USER_AGENT}

■ ただし Smartyで全ての環境変数が取得できるわけではありません。

なので

{ foreach from=$smarty.server key="k" item="v" }
{$k}:{$v} 
{ /foreach }

としてどういう環境変数が取得できるのかを調べるのがいいでしょう。



No.490
04/21 10:18

edit

Smarty
Cookie
セッション

携帯サイトなどCookieを使えないクライアントの場合に自動でセッション変数をURIに埋め込む

(一部の)携帯などでcookieを使えない場合にセッションIDをURIに埋め込んで使用する方法が一般的です。

そこで

・cookieを受け付けるときはcookieを使用したセッション。

・cookieを受け付けないときはURI埋め込みを使用したセッション。

を実現します。

php.ini の設定

session.use_cookies = 1
session.use_only_cookies = 0

としてapache をリスタート

apachectl graceful

で準備OK。

後はPHPスクリプト内で

定数SID が存在するブラウザの場合 → cookie使用不可(携帯など)

定数SID が存在しないブラウザの場合 → 通常のWEBブラウザ

で判別できます。

session_start();
if (SID){
	// cookieを使えないブラウザの処理
}
else {
	// cookieを使えるブラウザの処理
}

No.489
04/21 10:18

edit

携帯スマホサイト
Cookie
セッション

cookieを使わずにセッション管理する(ログイン認証が必要な携帯サイト用)

セッションは通常cookieを通してやりとりしますが、cookieを使えないブラウザ

(携帯端末 Docomo Softbank )等でセッション機能を実現させたい場合はセッションIDを

URIに埋め込んで使用することになります。

■ セッションをURLに埋め込んで使用するには以下の記述を行います。

/etc/php.iniに設定する場合(書き換えたら apache をリスタート)

session.use_trans_sid = 1

.htaccessに設定する場合

php_flag session.use_trans_sid On

phpコードに記述する場合

ini_set('session.use_trans_sid', '1');

ただし

注意: 相対URLでないURLは外部サイトを指していると仮定され、SIDが追加 されません。これは、SIDを外部のサーバに開示することはセキュリティ 上のリスクとなる可能性があるためです。

なので注意


■ セッションに関するパラメータを変更するには phpコード内に以下の記述を行います。

が、通常書き換えなくてもOKです。

//一文字あたりのビット数(4,5,6)数値が大きいほどセッションIDを短くすることが出来る
ini_set('session.hash_bits_per_character', 6);
//セッションパラメーター名 デフォルト値:PHPSESSID
ini_set('session.name', '_SESSID');
//ハッシュ関数 0:MD5(128bits) 1:SHA(160bit) デフォルト値:0
ini_set('session.hash_function', 1);

参考:

http://labs.scyphus.co.jp/memos/php/session

http://www.yc.musashi-tech.ac.jp/~yamada/doc/php/0802.html

http://ke-tai.org/blog/2007/12/12/php_session_new/

No.481
07/14 14:08

edit

携帯スマホサイト
Cookie
セッション
.htaccess