[FuelPHP]画面リロードや不正なフォーム登録を防ぐ

Posted 2012年2月10日 | Auther dada | Category PC・デジタル | Tag タグ: ,
Twitterにツイートする Facebookでシェアする はてなブックマーク

いわゆるCSRF対策のメモです。

Webでのデータ登録には
入力 → 確認 → 完了 という3つのフェーズで行うのが一般的です。

中でも最後の「完了」でデータ登録を行うことが多いため、
このページでリロードを行われると重複登録になったり、
前2フェーズを飛ばして不正なフォームをPOSTしてくるなどの
対策をする必要があります。

今まではセッションを使うなどして自前でコードを書く必要がありましたが、
FuelPHPでは Securityクラスを使うことで簡単に行えます。

確認画面のフォーム部分に下記を追加します。

echo Form::hidden( Config::get('security.csrf_token_key'), Security::fetch_token() );

下記のような隠し項目が書き出されます。

<input name="fuel_csrf_token" value="8af49a49ef926ca20fb713542c258fb4" type="hidden" id="form_fuel_csrf_token" />

そして登録を行うコントローラーで下記のように振り分けます。

if( !Security::check_token() ){
  // エラー表示
}else{
  // 正常なデータ登録
}

下記のサイトでは様々なセキュリティ対策について書かれてます。

[FuelPHP]セッションをクッキーからファイルやDBに変更する

Posted | Auther dada | Category PC・デジタル | Tag タグ: ,
Twitterにツイートする Facebookでシェアする はてなブックマーク

CSRF対策についてはこちらの記事が良いかもしれません。

PHPには標準で $_SESSIONが用意されていますが、FuelPHPにもセッション管理用に
Sessionクラスが用意されています。

セッションの書き込みには Session::set() を使います。
名前と内容のペアを渡すだけなので簡単です。

Session::set( 'name', 'hogehoge' );
Session::set( 'characters', array( 'haruka', 'chihaya', 'miki', 'yayoi' ) );

2行目のように、オブジェクトを渡すこともできます。
連想配列や、多次元配列でも可能です。

取り出すには Session::get() を使います。

$name = Session::get( 'name' );
$characters = Session::get( 'characters' );
$all_sessions = Session::get();
$nodata = Session::get( 'no_exists', 'hogehoge' );

3行目:引数がない場合は全てのセッションデータを取得する。
4行目:セッションが存在しない場合の初期値を指定。

削除は Session::delete( 'name' ); という感じで行います。

一度きりのセッション

set_flash()、get_flash()
というメソッドもあります。
set() で作ったセッションはしばらく残りますが、
set_flash() で作ったものは一度使うと消えるようです。

Session::set_flash( 'name', 'azunyan' );
$name = Session::get_flash( 'name' );
Session::delete_flash( 'name' );

set()、get()、delete()と使い方は同じですね。

セッションをファイルに保存する

今回はこちらの記事を参考にさせていただきました。
というかほぼそのままです。

初期状態ではセッション情報をクッキーに保存しているので、ファイルに書き出すようにします。

fuel/core/config/session.php を fuel/app/config/session.php にコピーします。
エディタで下記のように編集します。

'driver'  => 'file',

ファイルの保存場所が「/tmp」になっていますが、自分は Windows環境でテストしたいので
FuelPHP管理下のフォルダに作ることにします。

'file'              => array(
  'cookie_name'     => 'fuelfid',
  'path'            => APPPATH.'/tmp',
  'gc_probability'  => 5
),

セッションをDBに保存する

設定ファイル session.php の下記部分を「db」に修正します。

'driver'  => 'db',

dbにセッション専用のテーブルを作成します。
下記SQLで作成できるようです。

CREATE TABLE IF NOT EXISTS `sessions` (
`session_id` varchar(40) NOT NULL,
`previous_id` varchar(40) NOT NULL,
`user_agent` text NOT NULL,
`ip_hash` char(32) NOT NULL DEFAULT '',
`created` int(10) unsigned NOT NULL DEFAULT '0',
`updated` int(10) unsigned NOT NULL DEFAULT '0',
`payload` longtext NOT NULL,
PRIMARY KEY (`session_id`),
UNIQUE KEY `PREVIOUS` (`previous_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

ドキュメントによるとメモリキャッシュに書き出すこともできるみたいですね

[FuelPHP]独自のバリデーションルールを作る

Posted | Auther dada | Category PC・デジタル | Tag タグ: ,
Twitterにツイートする Facebookでシェアする はてなブックマーク

前回の日記「[FuelPHP]フォームのバリデーションとカスタムメッセージ」の続きで
自分ルールのバリデーションを作るメモです。

fuel/app/classes/myvalidation.php に記述します。

名前:no_same_chara
ルール:
「chara1」「chara2」「chara3」3つのフィールドに重複があれば false。
ただし内容が「chara_none」なら除外する。

<?php
class MyValidation
{
  public static function _validation_no_same_chara($val)
  {
    $chara1 = Input::post('chara1');
    $chara2 = Input::post('chara2');
    $chara3 = Input::post('chara3');

    if( $chara1 == $chara2 && $chara1 != 'chara_none' ) return false;
    if( $chara1 == $chara3 && $chara1 != 'chara_none' ) return false;
    if( $chara2 == $chara3 && $chara2 != 'chara_none' ) return false;

    return true;
  }
}

いきなり引数 $valを無視してますw
普通に項目の内容を検証するには下記のようにします。

public static function _validation_test_validation( $val )
{
  return $val == "ABC" ? true : false;
}

オプションを与えることもできます。
オプションの必要なルールだと「max_length」が良い例ですね。
下記ではエラーメッセージも同時に設定しています。

public static function _validation_test_validation( $val, $option )
{
  Validation::active()->set_message('test_validation', ':label は「'.$option.'」じゃない。');
  return $val == $option ? true : false;
}

前回の記事でメッセージのカスタマイズについて書いたように
fuel/app/lang/ja/validation.php
に記述してもかまいません。

[FuelPHP]フォームのバリデーションとカスタムメッセージ

Posted 2012年2月9日 | Auther dada | Category PC・デジタル | Tag タグ: ,
Twitterにツイートする Facebookでシェアする はてなブックマーク

フォームから入力されたデータの検証(Validation)についてのメモです。

FuelPHPでフォームを扱うにはひとつひとつViewに記述していく方法と、
Fieldsetクラスを使ってまとめて管理する方法があるようです。

Fieldsetクラスを使うほうが FuelPHPらしいのですが、
Fieldset->build() で出力される HTMLが目的と違うので
今回はひとつひとつ書いていきました。

echo Form::open('entry/confirm');

echo Form::label('名前','name');
echo Form::input('name', Input::post('name'), array('class'=>'intput-middle'));

echo Form::label('メールアドレス','email');
echo Form::input('email', Input::post('email'), array('class'=>'intput-middle'));

echo Form::submit('submit', '確認');
echo Form::close();

バリデーションを行う

バリデーションのやり方は簡単で、Validationクラスのインスタンスを作れば
フォームの内容は自動的に格納されます。

$validation = Validation::forge();

$validation->add( 'name', 'お名前' )
  ->add_rule('required');

$validation->add( 'email', 'メールアドレス' )
  ->add_rule('valid_email')
  ->add_rule('required');

forge()でインスタンスを作り、add()、add_rule()で
項目とバリデーションルールを設定します。
ルールはこのへんが標準で用意されています。

if( $validation->run() )
{
  // 問題ない時の処理
}
else
{
  // 問題ある時の処理
  // エラーの項目とメッセージの連想配列を取得
  $errors = $validation->error();
  // エラーメッセージ用HTMLを取得
  $error_html = $validation->show_errors();
  // 検証に使用した入力値を項目と値の連想配列で取得
  $error_input = $validation->input();
}

run()でバリデーションを行い、エラーの場合はその結果を取得します。

show_errors()の結果は HTMLなので、そのままビューに渡すとエスケープされてしまいます。
set_safe() で渡すことで HTMLのままになります。

$this->template->content = View::forge( 'entry/index', Array(
  'errors' => $errors,
  'error_input' => $error_input
));

$this->template->content->set_safe( 'error_html', $error_html );

上記は Controllerクラスの継承ではなく Controller_Templateクラスの継承の場合です。
Controllerの場合は下記のように記述します。

$view = View::forge( 'entry/index', Array(
  'errors' => $errors,
  'error_input' => $error_input
));
$view->set_safe('error_html', $error_html);

エラーメッセージのカスタマイズ

fuel/core/lang/en/validation.php をコピーし
fuel/app/lang/ja/validation.php に保存します。

バリデーション項目ごとに記述されているので自分の好きなように編集します。

return array(
  'required'      => ':label が入力されていません。',
  'valid_email'   => ':label の書式が正しくありません。',
  ~略~
);

初期状態では英語設定なので、日本語設定にします。
fuel/app/config/config.php の下記の部分を書き換えます。

'language'           => 'ja',
'language_fallback'  => 'ja',

以上のようにバリデーションと、メッセージのカスタマイズが行えます。
下記サイトがとても詳して大変参考にさせていただきました。

AMPPSを使ってWindowsでApacheを動かす設定メモ(2)

Posted 2012年2月7日 | Auther dada | Category PC・デジタル | Tag タグ: ,
Twitterにツイートする Facebookでシェアする はてなブックマーク

サブドメイン「test」を作って、「http://test.localhost/」として表示されるように設定します。

hostsの編集

hostsファイルは「C:WINDOWSsystem32driversetc」にあります。
ただのテキストファイルなのでメモ帳などで編集できます。

127.0.0.1       localhost

という行がありますので、下記のように追加します。

127.0.0.1       localhost
127.0.0.1       test.localhost

「http://test.localhost/」を開いてAMPPSの画面が出てくれば成功です。

Windows7の場合

Windows7の場合hostsを編集しようとするとエラーが出てくることがあります。
その場合、編集したいプログラム(メモ帳など)のプロパティから
互換性タブ>特権レベル>管理者としてこのプログラムを実行する
にチェックを入れてください。

バーチャルホストの設定

httpd.conで下記の行がコメントアウトされていないことを確認します。
httpd.confは「AMPPSインストール先apacheconf」にあります。

# Virtual hosts
Include conf/extra/httpd-vhosts.conf

バーチャルホストに関する設定ファイル「AMPPSインストール先apacheconfextrahttpd-vhosts.conf」を編集します。
初期状態では空っぽになっています。
「conforiginalextrahttpd-vhosts.conf」をコピーしても構いません。

NameVirtualHost *:80

<VirtualHost *:80>
    DocumentRoot "U:/http"
    ServerName test.localhost
    ErrorLog "logs/test-error.log"
    CustomLog "logs/test-access.log" common
</VirtualHost>

<directory "U:/http">
	order deny,allow
	deny from ALL
	allow from ALL
</directory>

フォルダ位置は任意でかまいません。
ポートを変更した場合は「80」になっている箇所も合わせます。

<directory>~</directory>は無くてもいいという記事もありましたが、無いと表示されませんでした。

[jQuery]個別の画像をラジオボタンやチェックボックスにするプラグイン

Posted 2012年1月30日 | Auther dada | Category PC・デジタル | Tag タグ: ,
Twitterにツイートする Facebookでシェアする はてなブックマーク

キャラクター人気投票で画像自体をフォームのラジオボタンやチェックボックスに
使いたかったので作りました。

<label>内に画像を置けばボタン代わりに出来るんですが、
選択状態によって画像を切り替えたかったのと、
IEだけ<label>内の画像に反応しないという、いつものアレな仕様もあったので……。

》jQuery.sygImageRadio
》デモページ

画像をラジオボタンやチェックボックスの代わりにすることで
デザインの自由度が上がるのと、入力状態がわかるのでユーザーの利便性が上がります。

詳しい使い方などはGitHubの配布ページでどうぞ。
》jQuery.sygImageRadio

[jQuery]スクロール対象の幅が可変なカルーセルプラグイン

Posted 2012年1月28日 | Auther dada | Category PC・デジタル | Tag タグ: ,
Twitterにツイートする Facebookでシェアする はてなブックマーク

複数の画像などをスクロールさせるのを「カルーセル」と言いますが
いざ使おうとしたら自分の求める仕様のものがなかったので(探すの面倒だったし)
作ってしまいました。

》jquery.syg_carousel
》デモページ

  • スクロール対象の幅がバラバラでも大丈夫
  • スクロールするだけのシンプルさ

というのが特徴です。

詳しい使い方などはGitHubの配布ページでどうぞ。
》jquery.syg_carousel

githubで変更をプッシュできなくてハマった時の対処法

Posted 2012年1月27日 | Auther dada | Category PC・デジタル | Tag タグ: ,
Twitterにツイートする Facebookでシェアする はてなブックマーク

github使ってみようかなーと、自作の適当なjQueryプラグインをコミットしてみました。

jquery.syg_carousel
https://github.com/sygnas/jquery.syg_carousel
スクロールアイテムの幅が可変なカルーセルプラグインです。

で、アップデートをコミットしている時にハマってしまったので
その解決法をメモしておきます。

エラーはこんな感じ。
他で更新されたものと競合してるとかそんなですか?

To [email protected]:sygnas/jquery.syg_carousel.git
! [rejected] master-> master(non-fast forward)
error: failed to push some refs to '[email protected]:sygnas/jquery.syg_carousel.git'
github 'Note about fast-forwards' section of 'git push --help' for details.

続きを読む

[Titanium]ファイルを追加するとerror loading path

Posted 2012年1月16日 | Auther dada | Category PC・デジタル | Tag タグ: , ,
Twitterにツイートする Facebookでシェアする はてなブックマーク

TitaniumでのiOSアプリ作成にチャレンジしてます。
gihyo.jpの連載「Titanium Mobileで作る! iPhone/Androidアプリ」を参考に
進めていたらわりと基本的なところでつまづいてしまったのでメモしておきます。

[ERROR] error loading path: /Users/dada/Library/Application Support/iPhone Simulator/5.0/Applications/B790C5A7-CFA7-4B14-A281-A944BF9420C9/testApp.app/table_view.js, Error Domain=NSCocoaErrorDomain Code=260 "The operation couldn’t be completed. (Cocoa error 260.)" UserInfo=0x8c97840 {NSFilePath=/Users/dada/Library/Application Support/iPhone Simulator/5.0/Applications/B790C5A7-CFA7-4B14-A281-A944BF9420C9/testApp.app/table_view.js, NSUnderlyingError=0x8c94390 "The operation couldn’t be completed. No such file or directory"}

app.jsの内容を分割してみたら、そんなファイルはないというエラーが。
解決方法は簡単で、メニューの[Project>Clean]を実行するだけでした。

プロジェクトクリーン後、実行し直すと分割したファイルも読み込むようになります。

CodeIgniterで気付いたこと

Posted 2011年11月17日 | Auther dada | Category PC・デジタル | Tag タグ: ,
Twitterにツイートする Facebookでシェアする はてなブックマーク

最近は猫写真アップしてませんね。^^;

アンケートスクリプトを作成するのにCodeIgniterを使ってみました。
CakePHPに比べてルールがゆるく、覚えることが少ないのですぐに使い始めることができました。

が、ちょっと「アレ??」と思うことがあったのでメモしておきます。

フォームバリデーションで複数条件を指定する時はパイプで

$this->form_validation->set_rules( 'hoge', 'ほげ', 'foo' );
$this->form_validation->set_rules( 'hoge', 'ほげ', 'bar' );

という感じに項目「hoge」に「foo」、「bar」の2つの条件を指定したら、
「foo」がFALSEでも「bar」がTRUEだったら通ってしまいました。
他に原因があるのかもしれませんが、下記のようにパイプ指定することで対応できました。

$this->form_validation->set_rules( 'hoge', 'ほげ', 'foo|bar' );

セッションは全てクッキーに保存される

一応暗号化されているようですが、やはりサーバーに保存したいこともあります。
標準セッションを使うライブラリも存在はするのですが、結局面倒くささに負けて
CIのセッションライブラリを使うことにしました。^^;

セッションについては皆さん苦労されているみたいですね。

#今回はなるべく負荷はかけたくなかったのでDBに格納することは考慮していません。

カテゴリー