2008年02月06日
フォーム二重送信防止の考察

Webアプリケーションなどにおいて、フォームの送信の際に、入力→確認→完了の手順をとることが多い。CRUD(Create Read Update Delete)のように、Input Confirm Completeで、ICCなんて個人的には呼んでいる。
それはさておき、確認画面から送信ボタンを押して、データベースに登録するなり、メール送信するなりをした場合に、そこでブラウザをリロードしたり、ブラウザの戻るボタンを押して再送信したり、ボタンを2回クリックしたりすると、フォームが二重に送信されてしまう。
これらの対処としては、トランザクショントークンを用いた対策方法が主流である。
確認フォームで、hiddenタグに乱数などで生成されたトークンを埋め込み、同時に同じキーをセッションに持つ。フォームが送信されたらトークンとセッションのキーが一致するか確認し、一致したら正常処理を行い、セッションのキーを破棄。一致しなかったら、エラーとみなし、処理を行わずにリダイレクトなど。
送信後にブラウザのバックなどで戻り、再送信した際には、セッションのキーは既に破棄されてしまっているので、一致することはなくエラーにしかならない。これで二重送信を防止。
とまぁ、これで問題はなさそうなのではあるんですが。
PHPの場合、セッションをスタートすると、デフォルトでヘッダーにno-cacheをセットする。
その状態で、ブラウザでバックし、確認画面などのhiddenタグを埋め込んでいるところに戻ると、no-cacheゆえにページが再読込されて、トークンキーの値が変わってしまい、セッションにもキーが再びセットされ、二重送信が行えるようになってしまう。
no-cacheにしない事がトランザクショントークンを使う場合の条件のようであるが、そのためには、セッションがスタートする前に、
session_cache_limiter('private_no_expire');
なんて書いておけくと良い。これでブラウザでバックしても再読込されないので、二重送信もしっかりと防ぐことが出来るようになる。
一般的なユーザーは、入力内容に間違いがあったと気がつくと、直感的に戻るボタンを押すことが多いと思うので、ブラウザのバック自体は行えたほうが良いが、最終的なフォーム送信後に戻れてしまうと、たとえ二重送信防止となっていて、二回目の送信は実際の処理が行われないとしても、ユーザーは訂正を行ったうえで、再送信を行ったのだと思うかも知れず、そうなってしまうとユーザーの意図と、システムの振る舞いに差異が生じるので、一度送信完了したなら、そのフォームには戻れないようにしたい。
ということで考えていること。
no-cacheが基本
フォーム生成時に、乱数等にてformidを生成。同時にセッションにformidを格納
formidパラメーターを付与したURLにリダイレクト。
ブラウザでバックした場合は、formidに紐づくセッション内容を元にフォームを復元
フォームの送信時にはformidに紐づくセッションを削除
紐づくセッションがない場合は、どこかに遷移
編集用のフォームは、初回の表示もセッションから呼び出し
CSRF対策のトークンキーも盛り込む
みたいな感じ。
こんな感じで、試しに実装してみようと思う。
最後の部分、何を書いているのか自分しか分からないかも。
2008-02-09追記
amazonで本を注文したついでにブラウザで戻って再送信してみた。
キャッシュが利くようになっていて、前に問題なく戻れるようになっている。
で、2重送信してみたところ、以下のメッセージが表示された。
確定後の注文を、ブラウザの「戻る」ボタンで注文手続きページに戻って変更することはできません。
ちゃんとメッセージを表示させれば、お客さんも混乱しないですね。
投稿者 田中@グリニッジ : 23:40 | コメント (0) | トラックバック
2007年09月26日
PHPの整数型と浮動小数点数型の境界

PHPでは、整数型の範囲を超えると自動で浮動小数点数型に変換される。
環境に依存するが、通常、整数型の範囲は、-2147483647 ~ 2147483647
これを超えた値で、(int)で整数型に変換するとオーバーフローする。
大きな数字を扱っていて、少々はまった。
投稿者 田中@グリニッジ : 20:29 | コメント (0) | トラックバック
2007年07月31日
EclipseでPHP開発 その2

Eclipse自体を使うのが初めてなので、いろいろ試行錯誤中。
PHPやLLの開発にいろいろ使ってきましたけれど、これというものが無くて結局はエディタで書いてしまうことが多いんですが、今後チーム開発とかを考えると、開発環境を改めて考えたほうが良さそうということで、Eclipse+PDTをお試し中。
IDEでは無いですが、WinCVS+Exam Diff+テキストエディタ という環境で長らく使っていて、それなりに使えていたんだけれども、PHPエディタを使ってみて、なんか良いかもと思いつつ、Subversionを使うようになると、バージョン管理と統合されていないIDEは非常に使いづらいということで、Eclipseがうまく使えるといいなぁと思っているところ。
Ecripse + PDT の設定覚書
-clean オプションを付けて起動するために、専用のショートカットを作成
ショートカットのアイコンを右クリックでプロパティを開き、リンク先を
C:\eclipse\eclipse.exe -clean
に変更し、適用
-clean オプションは、言語パックを入れた場合など、Eclipse のキャッシュ情報を初期化したい場合に使用
メニューの日本語化
当初、Eclipse 3.2.1 LanguagePack を利用してメニューの日本語化を図ろうとしたけれども中途半端にしか日本語化されないので、Pleiades にて日本語化。
http://eclipsewiki.net/eclipse/?%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3%C6%FC%CB%DC%B8%EC%B2%BD%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3
インストール方法は解凍したファイルの中の readme.txt を参照。
文字コードの設定 デフォルトを EUC-JP に設定する場合
eclipse ではファイルごとに文字コードを設定することになっています。
初期設定では文字化けするので、PHPのソースを「EUC-JP」で開くように設定する。
メニューのウィンドウ→設定
メニュー「一般→コンテンツ・タイプ」
「テキスト → PHP コンテンツ・タイプ」でデフォルト・エンコードを「EUC-JP」と入力し、更新、OKボタンをクリックする。
でも、今後はUTF-8で開発することに決めました。
表示のフォントサイズを変更
MS ゴシック 9 ポイントで最適となるように調整。
フォントの設定は、ウィンドウ -> 設定 -> 一般 -> 外観 -> 色とフォント -> 基本 -> テキスト・フォント -> 変更
JStyle エディターに全角空白、半角空白、改行、タブを表示
http://mergedoc.sourceforge.jp/jstyle.html
上記のプラグインを、pdt-all-in-one-S20070611_M1-win32.zip で利用する場合は、JStyle for Eclipse 3.3.0 を利用。
pdt-all-in-one-S20070611_M1-win32.zip は Eclipse のバージョンが3.2.1 と表示されるけれども、プラグインのディレクトリ内を覗くと3.3.0用のプラグインが多く見受けられる。
そのためか、JStyle for Eclipse 3.2.2 はうまく動かない(Eclipse が起動しなくなる)。
Subversion を使えるように。
当初、Subclipse をインストールしたけれど、Subversive のほうがよさげ。
調査中。
投稿者 田中@グリニッジ : 18:28 | コメント (0) | トラックバック
2007年07月20日
EclipseでPHP開発

を試してみようということで、Eclipse PDT(PHP Development Tools)をインストールしてみての覚書。
EclipseでPHP開発
http://journal.mycom.co.jp/column/ide/006/index.html
を参考に。
XAMPPのインストール
http://www.apachefriends.org/jp/index.html
http://www.thinkit.co.jp/free/article/0701/12/3/
PDT(PHP Development Tools)のインストール
http://download.eclipse.org/tools/pdt/downloads/
オールインワンパッケージをダウンロード
ZendDebuggerをインストール
http://downloads.zend.com/pdt/server-debugger/
以下を参考に
http://liosk.blog103.fc2.com/blog-entry-13.html
ZendOptimizerとZendDebuggerを共存させるには
\Program Files\xampp\php\zendOptimizer\lib の下にでもデバッガ用フォルダを作成し、
\Program Files\xampp\php\zendOptimizer\lib\Debugger\php-5.2.x
ここに ZendDebugger-5.2.3-Windows-i386\5_2_x_comp 下の ZendDebugger.dll をコピーする。
php.ini には以下のように記述。
zend_extension_manager.debug_server_ts = "C:\Program Files\xampp\php\zendOptimizer\lib\Debugger"
ちなみに、php.iniは以下が通常用
C:\Program Files\xampp\apache\bin\php.ini
php-switchを使う場合は、以下なんかも変更の必要があるみたい
C:\Program Files\xampp\php\php.ini
C:\Program Files\xampp\php\php4\php.ini
投稿者 田中@グリニッジ : 17:12 | コメント (0) | トラックバック
2007年07月06日
CakePHPが面白い

Ethna×PHP [LLフレームワークBooks] (LLフレームワークBOOKS # 2)を読みつつ、他のフレームワークを物色していて、CakePHPの面白さに目覚めました。
最近、百式の管理人さんが、idea*ideaでCakePHP修行をしていたり、gihyo.jpでCakePHPで高速Webアプリ開発なんて連載が始まったりして、気にはなっていたんですが。
良いなぁと思った点は、日本語でもドキュメント類が結構しっかりと揃っている点、ちゃんと使えそうなO/Rマッパーが組み込まれている点、インストールが簡単で、レンタルサーバーでも簡単に動作させられそうな点。
CakePHP プログラマーズ リファレンスガイドの付録 A. Cake ブログチュートリアルをこなしてみるだけで、一通り、Webアプリケーションを作るうえでの作業を体験できるのも良いですね。
とっつきやすさでは、いままで触ってみたPHPのフレームワークでは一番です。
Ruby on Rails の影響を受けているだけあって、規約が重視されますが、規約にのっとって開発さえすれば結構楽チンなのかも。
ということで、CakePHPでカートを作ってみることにしましょう。
海外のユーザーが多いのもメリットだと思います。
方針としては、
・多言語対応 まずは日本語と英語
・最近のいろいろなカートのスタンダードな仕様に準拠
投稿者 田中@グリニッジ : 16:48 | コメント (0) | トラックバック
2006年09月28日
Ethnaの0.2.0と2.1.2におけるaction_cliの違い

0.2.0ベースで作成したプロジェクトで、2.1.2で動くように修正をかけている場合において、action_cli周りの仕様が少々異なるので注意が必要。
まず、0.2.0で作ったプロジェクトのコントローラーには、action_cliのディレクトリの指定がないので、追記が必要。
appid/app/Hogeprojyect_Controller.php
のディレクトリをいろいろ指定しているところで、
'action_cli' => 'app/action_cli',
そんでもって、action_cli用のエントリポイントを作成
appid/bin/hoge.php
この部分は、以前と変らないけれど、通常のエントリポイントがmainなのをCLIの場合はmain_CLIにする。
第二引数に実行するアクションを指定する。
<?php
chdir(dirname(__FILE__));
include_once('../app/Hogeproject_Controller.php');
ini_set('max_execution_time', 0);
ini_set('mbstring.language', 'Japanese');
ini_set('mbstring.encoding_translation', 1);
ini_set('mbstring.http_input', 'auto');
ini_set('mbstring.http_output', 'EUC-JP');
ini_set('mbstring.internal_encoding', 'EUC-JP');
ini_set('mbstring.detect_order', 'auto');
ini_set('mbstring.substitute_character', 'none');
Hogeproject_Controller::main_CLI('Hogeproject_Controller', 'hoge');
?>
みたいな感じ。
あとは、アクションをaction_cliに保存。←これが変更された部分
呼び出すアクションがHogeなら、
appid/app/action_cli/hoge.php
にアクションを作成
※この部分は、CVSのログを読んだら書いてあった
- ethnaコマンドにadd-action-cliを追加
- [breaking B.C.] main_CLIのアクション定義ディレクトリをaction_cliに変更
-- すいません、後方互換性なくしてます
-- main_CLIで実行するアクションはaction_cliディレクトリ以下に移してくださいです
-- controllerのdirectoryプロパティに'bin'要素を追加
あとは、クラス名の命名でちょっとはまって、Ethnaのソースを読んだ。
結果以下のような形にする必要があることが判明。
Hogeproject_Cli_Form_Hoge
Hogeproject_Cli_Action_Hoge
CLIでActionFormを使う場面が想像できないけれど、とりあえずEthnaのソースに書いてあった。
これで、2.1.2でも問題なく動くようになった。
※skelディレクトリにファイルが存在していると実行時にエラーが出た。←とりあえず削除
投稿者 田中@グリニッジ : 15:45 | コメント (0) | トラックバック
2006年06月08日
Ethna 2.1.2をインストール

6月6日にEthna 2.1.0がリリースされたと思ったら、連日のように細かく修正が出てますが、ここら辺で使ってみようとEthna 2.1.2をインストールしてみました。
Ethna未導入のRedhat Enterprise Linux 4サーバーに導入。
PEARの再インストール
# links -source http://go-pear.org/ | php
続いて、インストールしようと
# pear install http://ethna.jp/pear/Ethna-2.1.2.tgz
を実行。とりあえずインストールはできたようだけれど、
WARNING: channel "pear.php.net" has updated its protocols, use "channel-update pear.php.net" to update
といわれたので、
# pear channel-update pear.php.net
を実行しておいた。
# pear info Ethna
About Ethna-2.1.2
=================
Provides Classes: Ethna_ActionClass, Ethna_ActionError,
Ethna_ActionForm, Ethna_AppManager,
Ethna_AppObject, Ethna_AppSearchObject,
Ethna_AppSQL, Ethna_Backend,
Ethna_CacheManager, Ethna_ClassFactory,
Ethna_Config, Ethna_Controller, Ethna_DB,
Ethna_Error, Ethna_Filter, Ethna_Handle,
Ethna_I18N, Ethna_InfoManager, Ethna_Logger,
Ethna_LogWriter, Ethna_MailSender,
Ethna_Session, Ethna_SkeltonGenerator,
Ethna_UnitTestCase, Ethna_UnitTestManager,
Ethna_UnitTestReporter, Ethna_Util,
Ethna_ViewClass, Ethna_Form_Info,
Ethna_Action_Info, Ethna_Form_UnitTest,
Ethna_Action_UnitTest,
Ethna_CacheManager_Localfile,
Ethna_CLI_ActionClass, Ethna_DB_ADOdb,
Ethna_DB_Creole, Ethna_DB_PEAR,
Ethna_Handle_AddAction,
Ethna_Handle_AddActionCli,
Ethna_Handle_AddActionTest,
Ethna_Handle_AddActionXmlrpc,
Ethna_Handle_AddAppManager,
Ethna_Handle_AddAppObject,
Ethna_Handle_AddProject,
Ethna_Handle_AddTemplate, Ethna_Handle_AddView,
Ethna_Handle_AddViewTest, Ethna_Handle_Manager,
Ethna_LogWriter_Echo, Ethna_LogWriter_File,
Ethna_LogWriter_Syslog, Ethna_SOAP_ActionForm,
Ethna_SOAP_Gateway,
Ethna_SOAP_GatewayGenerator, Ethna_SOAP_Util,
Ethna_SOAP_WsdlGenerator, Ethna_View_Info,
Ethna_View_List, Ethna_View_UnitTest, Ethna
Package Ethna
Summary Ethna PHP Framework Package
Description Ethna Web Application Framework
Maintainers Masaki Fujimoto
halt feits
Keita Arai
Version 2.1.2
Release Date 2006-06-07
Release License The BSD License
Release State stable
Release Notes Ethna PHP Web Application Framework
Release Deps PHP >= 4.1.0
Package.xml Version 1.0
Packaged With PEAR 1.4.8
Version
Last Installed Version - None -
Last Modified 2006-06-08
さて、開発開発。
投稿者 田中@グリニッジ : 17:42 | コメント (0) | トラックバック
2006年04月28日
改めてPEARにどんなライブラリがあるかを調べてたら

有用そうなライブラリが結構ありますね。
EthnaとPEARで結構いけるかな。
PEAR::HTML_Menu サイトメニューの実装
PEAR::HTML_TreeMenu ツリーメニューの生成
PRAR::HTTP_Download データーのダウンロード
PEAR::Pager ページング機能
PEAR::Mail_Queue 非同期のメール送信
PEAR::Config 設定ファイルの読み書き(YAMLに対応すれば尚可)
osCommerceからのリファクタリングを考えているのだけれど、モジュール部分のインターフェイスをどうするかが悩みどころ。まぁ、アジャイルちっくに適当に造りはじめましょうか。
投稿者 田中@グリニッジ : 10:24 | コメント (0) | トラックバック
2006年04月27日
今年は日本でTYPO3がブレイク?

Yet Another 仕事のツールにて、先日よりTYPO3が取り上げられている。
超高機能CMSらしいけれど。
試しにインストールしてみましたらば、確かに高機能のようなんですが、使い方がいまいち理解できてません。使い方を覚えてしまえばハッピーな世界が開けるのでしょうか。PHPとMySQLでできてます。
それにしても、ここ2週間ほどで、GoogleでヒットするTYPO3を扱う日本語サイトの件数が一気に増えましたね。
投稿者 田中@グリニッジ : 22:21 | コメント (0) | トラックバック
2005年01月10日
PHPのフレームワーク3

以前より存在に気がついてはいたが、こちらに書き込んでいなかったので、改めて。
このところ、PHPのフレームワークが色々と登場するようになって、選択肢も広がってきましたね。
投稿者 田中@グリニッジ : 12:50 | コメント (3) | トラックバック
2004年10月27日
PHPのフレームワーク2

なんか、軽快そう。
投稿者 田中@グリニッジ : 02:18 | コメント (1) | トラックバック
2004年10月24日
PHPのフレームワーク

PHPのフレームワークを調べていたので、いくつかリンクを。
Phrame : Web Development Platform
投稿者 田中@グリニッジ : 00:54 | コメント (5) | トラックバック
2004年09月21日
ionCube PHP Accelerator

PHPのパフォーマンスを向上させるソフトとして、PHP Acceleratorというフリーの製品があります。
Zend社より、Zend Acceleratorという同等の製品も出ていますが、こちらは30万円くらいしたと思うので、無償というのはいいですね。
PHPの設定ファイルを書き換える必要があるため、レンタルサーバーではインストールできません。こういうときのためにも専用サーバーを選ぶ価値はあります。
http://www.asial.co.jp/products/ioncube/accelerator/
インストール方法は、以下が参考になります。
http://www.php-j.com/tutorial/php/phpA.php
投稿者 田中@グリニッジ : 15:11 | コメント (1) | トラックバック
2004年07月20日
PHPのバージョンアップ

- 最新のtar.gzをwgetして、任意のディレクトリに保存
以下は、/tmp に http://www.example/com/example.tar.gzを保存する例。
wget -P /tmp http://www.example/com/example.tar.gz
- 解凍
- 解凍したディレクトリのユーザー権限をシェルのユーザーに変えておく
chwon -R username php-4.3.8
- 解凍したディレクトリ内に入り、./config ...
- make
- su
- make install
- php.ini-dist をもとに、php.iniを生成
copy php.ini-dist /usr/local/lib/php.ini
- apacheを再起動
