最近一週間ほどのえび日記
2011年11月30日(水曜日)
安全なWebアプリを作りたければ新しいフレームワークがオススメ
公開: 2011年12月10日21時20分頃
こんな記事が……なぜPHPアプリにセキュリティホールが多いのか? 第44回 セキュリティ対策が確実に実施されない2つの理由 (gihyo.jp)
例えば,Railsの入力のセキュリティ対策はセキュアであるとは言えません。Railsのバリデーションは「データベースにデータが保存される前」に行われます。データベースにデータを保存する必要がないようなアプリケーションの場合,入力のバリデーションをフレームワークとして行う仕組みになっていません。本来入力はデータベース利用の有無に関わらず入力を受け入れた直後に行うべきです。多くのフレームワークがRailsの影響を受け同様の仕様となっています。Railsが脆弱な仕様を採用したことは不幸なことだったと思います。
……。
まず、バリデーションはセキュリティのためにする処理ではありません。たまたまセキュリティの役に立つこともありますが、役に立たないこともあります。たとえば、問い合わせフォームに本文の入力欄があり、任意のテキストが入力できて、DBにはText型 (任意の長さの任意のテキスト) として保存するとましょう。この場合、空欄だとエラー、という程度のバリデーションしか行われないはずです。長すぎるデータを蹴る場合もありえるでしょうが、いずれにしてもセキュリティの役に立つ処理ではありません。
どんなバリデーションが行われるのかは、単に仕様によります。任意のテキストを許す必要があるなら、' (単引用符) だろうとでも < (小なり) だろうと入力させなければなりませんし、エラーにしてはいけません。セキュリティの観点から勝手なバリデーションをすると、そういった文字が入力できない残念なシステムになってしまいます。
逆の言い方をすると、バリデーションを行っても、それはインジェクション系の脆弱性への対応とはならないということです。数値のみを入力させる場合などは対策にもなり得るのですが、それはたまたまですので、バリデーションとは別途に考えなくてはなりません。題名の「セキュリティ対策が確実に実施されない理由」という観点で言うなら、バリデーションをセキュリティ施策の一環だと誤解している人がいる、ということが理由のひとつではあるでしょう。
それはさておき、なぜかRailsが叩かれているので、Railsの話を少し。
RailsにはActiveRecordというものがあります。これはDBのカラム名や型を見て、自動的にモデルクラスを作ってくれるというものです。逆に言うと、DBに保存しないデータはActiveRecordでは扱えません。
ActiveRecordのバリデーションの仕組みは優れているので、DBに保存しないデータも同じようにバリデーションしたい、というニーズはあります。ただし、これはセキュリティとはあまり関係なく、単に同じように扱いたいという動機であることがほとんどでしょう。古いRailsではこれが大変で、いろいろ頑張ってActiveRecord::Baseを拡張したクラスを独自に作ったり、かなり面倒なことをしていました。
そして、おそらくそう思った人が多かったからでしょう、Rails3ではActiveModelというクラスが追加されて、お望みのことが簡単にできるようになりました。古いRailsもべつ脆弱というわけではないと思いますが、DB由来でないデータもバリデーションしたい場合はRails3をオススメします。
※もし「バリデーションのタイミングが気に入らない、入力直後に常にやるべき」という話であれば、before_filterでvalid? メソッドを呼ぶようにでもすれば良いのではないでしょうか。特に意味はないと思いますが、やりたければ。
Viewヘルパーを利用すれば安全,と考えるのは危険です。Railsアプリケーションのソースコード検査も仕事でしていますが,Railsで開発している方でもViewヘルパーがすべてのパラメータをエスケープ処理してくれないことを知りません。これはRailsだけの問題でなくすべてのWebアプリケーションフレームワーク共通の問題だと思ってください。
「Viewヘルパーがすべてのパラメータをエスケープ処理してくれない」というのは、何を言われているのか良く分かりませんでした。Viewの中で変数を出力する際にHTMLタグなどがエスケープされない、という話をされているのでしょうか?
昔のRailsでは、Viewに <%= var %> のように書くと、値はそのまま出力されていました。エスケープしたい場合は <%=h var %> のように書く必要があります。つまり、ヘルパーメソッド h() を呼ぶ必要があります。
逆に言うと、h() さえ呼べば、ほとんどの場合は問題ありません。問題が起きるのは、属性値に引用符を付けていないとか、単引用符で括ろうとしているとか、JavaScriptのコードを出力しているとか、javascript:で始まるURLが入力できるとか、そういった限定的な状況だけです。通常は単に h() を呼べば良いだけです。ただ、h() を書き忘れることはあるので、そういう意味では注意が必要ではあるでしょう。
……というのは古いRailsの話で、Rails3では h() を呼ばなくてもデフォルトでエスケープされるようになりました。エスケープせずに出力したい場合は、明示的に <%=raw var %> と書く必要があります。というわけで、Rails3の方がXSSを避けやすくなっています。
Rails以外で言うと、ASP.NET4では <%: var %> のように書くとデフォルトでエスケープされます。以前、安全なテンプレートシステムはあるのかという話で「2種類のデータがどちらも同じ string 型なのがややこしさの元」と書きましたが、.NET4にはHtmlStringという型があって区別できるようになっています。エスケープなしで出力する場合は、HtmlString型の値を渡すとそのまま出力されます。
ASP.NET MVC3で使われるRazorも同様で、デフォルトではエスケープされ、HtmlString型を渡すとそのまま出力されます (HtmlStringのコンストラクタを呼ぶかわりに、「@Html.Raw(foo)」と書くこともできます)。
そんなわけで、新しめのフレームワークでは、Viewでの変数出力はエスケープされるのがデフォルトになってきています。結論としては、安全なWebアプリケーションを作りたければ、新しめのフレームワークを使うのがオススメ、ということで。
※ただ、PHPのフレームワークがどうなっているのかは良く知らないのですが。PHPに詳しい大垣さんが「すべてのWebアプリケーションフレームワーク共通の問題」と言われているということは、PHPのフレームワークはまだ駄目なのでしょうか……?
- 「安全なWebアプリを作りたければ新しいフレームワークがオススメ」にコメントを書く
関連する話題: Web / セキュリティ / クロスサイトスクリプティング脆弱性
傍聞き
公開: 2011年12月10日1時0分頃
読み終わったので。
傍聞き (www.amazon.co.jp)
これは面白かったです。4つの短編からなるのですが、どれも見事です。ミスリードもうまいですし、伏線の張り方、回収の仕方も素晴らしく、全てが一気に収束してぱっとパズルが完成するようなカタルシスが得られます。
表題作「傍聞き」も良かったですが、いちばん印象に残ったのは、最初の「迷走」。救急車に乗務する救急救命士の話なのですが、娘の仇と思われる人物を救急車に乗せ、病院に着く直前で何故か方向転換――という話。その理由が明らかになったところでちょっと泣きそうになってしまいました。読み直してみると、意味不明と思えた言動も実は最初から一貫した行動になっていて、ミスリードの巧みさに驚かされます。
短くて軽く読めますし、かなりオススメできる作品です。
2011年11月29日(火曜日)
ゼルダの伝説 スカイウォードソード 終盤へ
公開: 2011年12月7日0時55分頃
「ゼルダの伝説 スカイウォードソード (www.amazon.co.jp)」、引き続きプレイ中です。
おそらく終盤に突入。
中盤のボスにだいぶ難儀しました。特にイカ。まず、通常の攻撃は効いていないように見えて、そこまでは良いです。で、スカイウォードを当てると、ずばっと音がして触手が引っ込むわけです。こういう挙動をされると、スカイウォードでダメージが通っているように見えるのですね。しかし実際には縦斬りのスカイウォードはダメージになっておらず、延々30分戦っても終わらないというひどいありさま (しかもどこかで見たような光景)。
結論としては横切りのスカイウォードを当てれば触手が一発で斬れるのですが、そもそもスカイウォードを横切りで出せるということ自体知らなかったという……。ダメージが通っていないならいないで、そう分かるようにしてほしかったです。
正直なところ、「難しい」というよりも「面倒くさい」という印象のボスが多いです。ボスの攻撃は結構見切れるので、こちらは長期戦に耐えられます。倒し方さえ分かれば実行するだけです。ただ、倒し方が分かっても、それを正確に実行できるかどうかは別の問題です。横斬りでないと駄目と分かっていても縦斬りになってしまったりとか、突きを出せば良いと分かっていても斜め切りになってしまったりとか。リモコンをタイミング良く特定の方向に正確に振ることが求められるので、そんなに簡単な話ではありません。特にボス戦では焦りのせいか、リンクが思うように動いてくれないことが結構多いです。
いや、実際は、焦らなくても良いように設計されているのですね。リモコンを素早く振ったりする必要もなくて、むしろゆっくりやらないと駄目な場合が多いです。ギラヒムへのフェイントなどが典型例で、素早くやろうとするとフェイントが効かずに30分も決着がつかなかったりします。と、分かっていれば語れるわけですが、これは結果論です。初見のプレイヤーにはそんなことは分からないので素早く振ろうとするに決まっていますし、初見のボスにそんなに冷静にゆっくり対応できるわけがありません。
逆に言うと、2周目なら冷静に対応できるはずなので、かなり楽なプレイになるかも知れません。ボス撃破後にヒント映像を見ているというのも大きいです。
※……ちなみにこのヒント映像、基本的にスカイロフトでしか見られないので、ボス戦のヒントを見ようと思ったら負けた後にものすごく面倒な空の往復が必要になります。普通の人は撃破前にわざわざ見に行ったりしないと思うので、勝った後で見る感じになるでしょう。
まあ要するに、今までのゼルダ以上に、ボス戦でもプレイヤーの知識が重視される構成になっているということです。
2011年11月28日(月曜日)
「科学的思考」のレッスン
公開: 2011年12月4日23時50分頃
読み終わったので。
- 「科学的思考」のレッスン 学校で教えてくれないサイエンス (www.amazon.co.jp)
二部構成になっていて、前半では科学的な思考法について、後半では原子力発電の話を交えつつ「リテラシー」の話が展開されます。後半は、どちらかというと一般市民と科学との付き合い方という観点で、コミュニケーションの話に近いです。「もうダマされないための「科学」講義 (www.amazon.co.jp)」と似たようなテーマの本だなあと思ったら、巻末で
何がショックといって、自分の本の校正をしているときに、よく似たねらいの、しかもよくできた本が先に出ることくらいショックなことはないです。
以上、p287 より
と、紹介されていますね。
興味深く思ったのは後半の方です。「もうダマされない……」にもトランス・サイエンスという言葉が出ていましたが、こちらでも同じ概念が紹介されています。ページ数を多く割いていることもあって、整理の仕方はこちらの方が分かりやすいと思いました。
トランス・サイエンスの問題は、大きく次の三種類に整理できます。
(1) 知識の不確実性や解答の現実的不可能性のせいで解決できない。
(2) 対象がそもそも不確実な性質をもつために解決できない。
(3) 価値判断とのかかわりが避けがたいために解決できない。
原発事故に関して生じている問題にはこの全ての特徴が当てはまるでしょう。
以上、p199 より
それから印象に残ったのはこのあたりの表現。
必要なのは、「科学がどういうふうに進んでいくのか」「科学がどういうふうに政策の中に組み込まれているのか」「科学はどんな社会的状況が生じたら病んでいくのか」についての知識です。原子力発電の場合もそうです。
以上、p210 より
科学は自分たちとは関係ないよ、という態度では駄目だし危ないという話ですね。それから、最も印象に残ったのはこのくだりです。
この方は、さらに「でも、これだけ安全ですよと言っても、安心とは別ですからね」とおっしゃいました。いくら科学的には安全だと言っても、皆さんは安心できませんよね、ということです。ずいぶん物わかりのいい言い方ですが、これはまさに、安心とは心の問題である、科学的安全性と、安心は別問題です、と言っているわけです。
以上、p254 より
「科学的には安全」という言葉を一方的に繰り返しても意味がないと。単に正しいというだけでは駄目で、何が求められているのかを考えることも含め、コミュニケーションの仕方が重要だということですね。
2011年11月26日(土曜日)
よつばと! 11
公開: 2011年12月4日23時15分頃
よつばと! 11巻! 出ました!
- よつばと! 11 (www.amazon.co.jp)
しまうー! しまうーじゃないですか! しまうーが出ただけで満足ですが、全体的に素晴らしい面白さ。うどん、ピザ、栗と食べ物の話が結構多めですがことごとく面白いです。やんだが実はけっこう良い人っぽかったりとか。
あとはやっぱりジュラルミン水没事件ですね。鳴く機能があったとか、読んでいる方も忘れていましたよ。
2011年11月25日(金曜日)
ゼルダの伝説 スカイウォードソード UI関係のメモ
公開: 2011年12月4日22時45分頃
「ゼルダの伝説 スカイウォードソード (www.amazon.co.jp)」、引き続きプレイ中です。
中盤は過ぎたと思うので、このあたりで主にUI関係のメモなどを。
アイテム選択
アイテム選択は使いやすいような、そうでもないような。アイテム選択画面を出している間も時間は止まらないので素早く選択する必要がありますが、けっこう戸惑う場合があります。リモコンを傾けて選択するのですが、リモコンは普段、剣を向けている方向に傾いているので、デフォルトで選ばれるアイテムは剣が向いていた方向のものということになります。要するに、デフォルトはランダムになってしまっているということです。あらかじめ狙って選ぶのは、よほど慣れないと難しいと思います。
Bボタンを短く押すと選択済みアイテムを再使用できるのですが、戦闘中に焦っているとどうしても強く長く押してしまうので厳しいです。
※社長が訊く (www.nintendo.co.jp)で言われていた「ヒモ付き」の仕組み自体は良くできていると思います。画面上に選択するべきボタンが8つしかないなら、そのボタンの外側の範囲にポインタが動く必要はないわけです。ただ、PCだと全画面表示のアプリにしか適用できないので、あんまり参考にはならないかも。
ポーチアイテム選択
「-」ボタンを押してリモコンを傾けるとポーチアイテムを選択できます。ポーチには盾やビン (主に回復の薬) が入っているのですが、盾は非戦闘時に装備しておけばヌンチャクでいつでも使えるので問題ありません。
問題は薬。ポーチアイテムの選択の仕方はBボタンアイテムと似ているのですが、薬を選んだ後はAボタンを押して使用する必要があります。Bボタンのアイテムを使うときはAを押すという操作はないので、Bボタンのアイテムと似ていながらも異なる操作になっています。
薬は滅多に使わないのですが、ピンチの時は急いで使う必要があります。急いでいるときに薬を選択すると、どう使えばいいのかとっさに分からなくて死ぬことが結構あります。薬ビンを持った状態は盾も構えていなくて無防備です。薬を飲むときは走って逃げながら飲む必要があるのですが、逃げ場がなかったりすると薬を飲めずに死ぬことが良くあります。
たぶん慣れれば大丈夫なので、薬を飲む練習をしておくと良いかも知れません。:-)
大空
鳥に乗って空を移動するシーンが何度もあるのですが、この操作がなかなか厳しいです。羽ばたいて上昇、リモコンを前に傾けると下降しながら滑空してスピードアップ、なのですが、このスピードアップの操作が大変。そもそも、リモコンを前に傾ける動作は人間工学的に無理があるのか、手首がつらいです。それを維持するとなるとかなり大変で嫌になってきます。
しかも、この空の移動が何度も何度もあります。最初は気持ち良いのですが、同じ経路を何度も往復するとなるとすぐに飽きます。
ボス戦の前で回復の薬を使い果たしてしまった……という場合、薬を補給しに戻りたいわけですが、薬を売っている店は空の上のスカイロフトにしかありません (空の上が拠点で、他の店もそこにある)。ダンジョンの中のセーブポイントからは一瞬でダンジョン外に脱出できますし、外のセーブポイントからは一瞬で空に戻れるのですが、空からスカイロフトまではわざわざ飛ぶ必要があります (加速できるポイントなどもあるのですが、やっぱりある程度は飛ぶ必要がある)。
この、空を飛んで戻るのがとにかく面倒に感じてしまって厳しいです。空の道中で敵と戦ったり、という要素もほとんどありません (たまに申し訳程度にルピーをぶら下げたカラスが飛んでいる程度はありますが、相手にするより無視した方が明らかに早い)。行きに飛ぶ必要があるのは良いとして、戻るときはワープする方法があっても良かったのではないでしょうか。
2011年11月24日(木曜日)
ゼルダの伝説 スカイウォードソード Wiiモーションプラスを使ったバクダン転がし
公開: 2011年12月4日21時55分頃
「ゼルダの伝説 スカイウォードソード (www.amazon.co.jp)」、引き続きプレイ中です。
実は、このソフトを買った理由のひとつは、アイテム選択画面を試してみたかったから。
画面を見なくても、アイテムがある角度にWiiリモコンプラスを傾ければ、アイテム選択ができるようになったんです。
(~中略~)
あと、もうひとつ重要なポイントがあって、アイテム選択画面には指のアイコンが表示されるんですけど、それにヒモが付いてるんです。
こういう新しいユーザーインターフェイスには興味があるので買ってみたというわけです。まだアイテムがそんなにたくさんないので、このあたりが実際どうなのかはまだ何とも言えませんが。
ところで、今気になっているのはこちらの話。
それにバクダンも、Wiiリモコンプラスを上に向けて振ると、上から投げることができて、下に向けて振ると転がすこともできて、しかも、回転もかけられたりするんです。
2番目の大地である「オルディン火山」をクリアするためには、バクダンを転がすテクニックが必須です。しかし、これがなかなか難しい。そもそも、座ってプレイしていると、転がすアクションをしようとしてリモコンを下に向けたら床についてしまうわけです。バクダンを転がす必要がある場合は立ってプレイしろというのでしょうか。いやまあ、膝立ちでも大丈夫ですが……。
しかもバクダン花は早く転がさないと爆発してしまうので、立つ→リモコンを下向きに構える→転がす、を素早くやる必要があってかなり大変です (バクダン袋入手後は転がし始めるまで火がつかないので大丈夫)。
- 前(古い): 2011年11月23日(水曜日)のえび日記