創意無限空間

Archive for the 'PHP' Category

Smarty講座 第8回 このエントリーを含むはてなブックマーク

本日Smarty講座 第8回が公開されました。

今朝、起きてからPCを立ち上げてサイトチェックしていたら、Smartyの公式サイトが更新されており、確認してみると…… 昨晩、最新バージョンの2.6.22がリリースされたようでしたorz まさか2回続けて公開とタイミングがかぶるとは。

慌ててPHPプロ!の担当の方にメールを入れ、追記を入れてもらいました。

No comments

Smarty講座第7回 このエントリーを含むはてなブックマーク

昨年、PHPプロでSmarty講座の連載を全6回で担当させていただいたのですが、その続編を再び書かせていただくことになりました。本日第7回が公開されました。

前回のターゲットはSmarty初心者だったのですが、今回はもう少し使いこなした人にも興味を持ってもらえるような内容にしていこうと思っています。

追記:
今www.smarty.net見たら、2日に2.6.21がリリースされたみたいですね。タイミング悪いなぁ…

Version 2.6.21 (Dec 2nd, 2008)
------------------------------

- fix  function injection security hole closed (U.Tews)
- fix pass expiration time at cache_handler_fuc call in core.write_cache_file.php (U.Tews)
- Update of compiler.class.php to allow method chaining for PHP4 and PHP5 (U.Tews)
1 comment

CakePHPの$this->dataの扱い このエントリーを含むはてなブックマーク

アマゾンのサーバでエラーが起こっているかもしれません。一度ページを再読み込みしてみてください。

もう随分日が経ってしまってますが、CakePHP勉強会に参加してきました。内容に関してはあちこちで書かれているのでここでは省略。

さて、Shin x blogの新原さんの発表「CakePHPを業務に導入する」

$this->dataはそのまま使わない
=> 外部から来る値は信用しない

という話があったのですが、この件について書いてみようと思います。

$this->dataをそのままsaveしない

発表後の質疑応答で新原さんは、

formに入力された値を鵜呑みにすると危険。入力フォームで表示していないが存在するフィールドに対しても値が入ってしまう可能性があるので、いきなり$this->dataの値をsaveメソッドに渡さず、別配列に値を渡すなどして、必ず値のチェックをしましょう

という趣旨のことを話されていました。例えば以下のようなユーザーを管理するテーブルが用意されていたとします。

CREATE TABLE users(
id INTEGER PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
is_admin TINYINT
);

nameがユーザー名、is_adminが管理者を表すフラグとします。

ここで、ユーザーを追加するためnameの値だけ受け取るような入力フォームが用意されているとします。

<?php echo $html->input( ‘User/name’ ); ?>

Controllerでは$this->data['User']['name']に入力された値が入ります。

で、この$this->dataをそのまま$this->User->saveに渡すと値がDBに保存されますが、もし用意したフォーム以外から$this->data['User']['is_admin']に値が渡されていたらどうなるでしょう? 管理者権限が与えられてしまい、場合によってはそのサイトが乗っ取られてしまう可能性もあります。

空の値に注意

もう一つ、自分が遭遇した$this->dataの値をそのまま保存しないほうがいい理由について書いてみます。

例えば、商品を管理するテーブルが用意されているとします。

CREATE TABLE articles(
id INTEGER PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
price INTEGER,
openprice TINYINT
);

nameが商品名、priceが値段、openpriceがオープンプライスかどうかのフラグとします。
これらの3つを受け取る入力フォームを用意します。

<div>商品名: <?php echo $html->input( ‘Article/name’ ); ?></div>
<div>価格: <?php echo $html->input( ‘Article/price’ ); ?></div>
<div><?php echo $html->checkbox( ‘Article/openprice’ ); ?>オープンプライス</div>

さて、オープンプライスの商品を入力しようと思い、価格の値を空欄とします。この時$this->dataの値をそのまま保存するとどうなるでしょうか?

実は新規で保存した場合、価格の値はnullになるのですが、更新した場合は価格の値が0になります。これはUPDATE文でpriceの値に空文字列が渡されてしまうため、このような現象が発生します。

0とnullを区別する必要がない場合はいいのですが、例えばfindの条件でIS NULLを指定したい場合など、このままでは困ってしまうシチュエーションもあります。したがって、saveの前に値チェックを入れる必要があります。

if( empty( $this->data['Article']['price'] ) && $this->data['Article']['price'] != ‘0′ ){
$this->data['Article']['price'] = null;
}
$this->Article->save( $this->data );
?>

文字列フィールドの場合も空文字列として登録されてしまうので、nullと空文字列を区別したい場合は同様の処理が必要です。

まとめ

  • $this->dataの値を手つかずでsaveする場合は注意が必要
  • 入力フォームに表示していない値が渡ってくる可能性を想定する
  • 空の値の正規化をsave前に行う

おまけ

勉強会参加者の中に、家がすぐご近所の方を発見。しかも出身中学が隣だったことも発覚し、軽く衝撃w。そして懇親会で同じテーブルだった方が隣の市にお住まいだったりしてまたびっくり。Web業界って渋谷とか六本木とか、都心の方が盛り上がっているけど、多摩地区も負けてないなぁと思ったりもしました。三多摩IT技術者の会みたいなのが出来たら面白いかもしれませんね。

No comments

Smarty講座第5回 このエントリーを含むはてなブックマーク

本日Smarty講座第5回が公開されました。

過去4回はSmartyの使い方とか文法の話とかをしてきましたが、今回はSmartyを使って実用的なページ(問い合わせフォーム)を作ってみました。ソースコードが多いので、いつもよりページ数が増えてますw

1 comment

Smarty講座第4回 このエントリーを含むはてなブックマーク

Smarty講座第4回が公開されています。今回は関数と修飾子の話です。

No comments

Smarty講座第3回(第2回も) このエントリーを含むはてなブックマーク

Smarty講座第3回が本日公開されました。

…実はこちらに書くのを忘れていましたが第2回も先々週公開されています…

回を重ねるごとに、初心者に分かりやすく説明するのが難しくなってきました。コードが増えてきた分、それを読めば分かる人にはいいんでしょうが、必ずしもそういう人ばかりではない(むしろ多数だと思われる) ので、さてどうしたものかと思案中です。

No comments

Smarty講座 このエントリーを含むはてなブックマーク

PHPプロ!Smarty講座の連載を担当することになりました。

で、本日、第1回が公開されました。

初心者をターゲットとしているので、あまり突っ込んだところ(プラグインの作り方とか…)までは書けないと思いますが、Smartyやテンプレートエンジンに興味がある方は是非ご覧いただければ、と思います。

# イラストが可愛く描かれすぎて照れる…

No comments

PHPプロ!マガジン 2007年夏号 このエントリーを含むはてなブックマーク

アシアル株式会社様発刊のPHPプロ!マガジン 2007年夏号秋元@サイボウズラボさんと共著で記事を書かせていただきました。本日6月29日発刊です。ちなみに紙媒体ではなくオンラインPDFです。

「Webサービスとマッシュアップ」ということで、Webサービスに関する技術情報や公開されているWebサービスAPIの紹介、それを利用した実装例などについて執筆しました。秋元さんはPHP×WebサービスAPIコネクションズというWebサービスAPIに関する書籍を単著で既に発刊されており、色々と教えていただきながら今回発刊までこぎ着けることが出来ました。

さて、会社員時代も含めて初めて請け負った執筆の仕事だったのですが、実装やシステム設計、構築などの仕事と違って、色々新しい発見や改めて気付かされることがあって面白かったです。

技術情報の裏付けをとりながらの執筆が大変
嘘や間違った情報を書くわけにはいかないので、自分の中では理解しているつもりでも、いちいち調べて裏付けをとりながら書くという作業が必要でした。Blogなら後で自分で修正出来るけど、雑誌はそうもいかないので緊張感はありましたね。
(それでも間違いなどあるかも知れませんので、そのときはこっそり教えてくださいw)
言い回しの問題
ちょっとした言い回しの違いで言いたいことが伝わりにくくなったり、文節の順番の違いでどれが主語なのかわかりにくくなったり、読点の位置をどこにしたら分かりやすくなるか迷ったり… で悩みました。特に一気に書いたあと見直しの段階で、そういうところばかり目に付くようになるのが不思議ですね。自分の書いた文章なのに、後から分かりづらいと感じるところが多々見つかるのは…
誰が読んでいるのか?
書いている原稿の読者層を想定して、この説明だけで全てが伝わるか、突然出てきた用語を説明なしで流してしまって大丈夫か、というのは悩みましたね。逆にあまり説明がくどくても文章が冗長になるだけだし。見る人が分かっている社内文書と違って、不特定多数向けの文章だとこのさじ加減は難しいです…

もちろん仕様書や要件定義書など、普段の仕事で書くドキュメント類でも共通する注意点はありますし、ごく当たり前のこともあるんですが、それでも「多数の人の目に触れる文章を書く」という機会と向き合うことが出来、多くの「気づき」があったのは収穫大でした。

そして何より、技術調査しながら執筆したことにより、今まで何となく曖昧に理解していた点が明確になり、自分の中でしっかり吸収できたというのは大きかったですね。ちょっと前にまつもとさんと結城さんの対談記事で結城さんが

その前の段階で,自分の中には説明できないことは理解できていないという感覚がどこかにある。説明文を書いて,人に読ませるくらいの品質になっているかどうか,というのが私の理解の基準なんでしょうね。

と書かれていた意味がちょこっとだけわかった気がします。特に「品質」という意味では、まだ全然、結城さんの域には達していないですけどねw

ところで折角の初執筆のお仕事だったのですが、今回発刊された2007年夏号で休刊とのこと。大変残念です…

No comments