2012年 10月 11日

関連エントリー (画像)

サーバサイドからのデータの受け渡しに data-* を使う

(大した話ではないですが、だいぶ前にどっかで話して以来ブログに書いてなかったようです)

サーバサイドのプログラムから、クライアントサイドの JavaScript に何かしらのデータを受け渡しする場合というは、XSS を作りやすい部分であります。

<script>
var User = {
  id : [% user.id | js %],
  name : "[% user.name | js %]"
};
</script>

このようにテンプレートエンジンを使って script の中で何らかの変数を展開するような場合、HTML としてのエスケープと、JavaScript としてのエスケープを正しい順番で行う必要があるか、あるいは専用のフィルタ関数を作るなどが必要になります。すなわち、いずれにせよ正しい処理方法を覚えて、毎回間違えずに使う必要があります。これらは、正しい知識を持つエンジニアが正しい実装をして正しい使いかたをできれば問題ないと言えますが、そんな面倒なこと覚えていられねーよという話ですし、人間は忘れるものですから、本質的に危険です。


なので、最近僕が使っている方法が data-* で値を受け渡す方法です。

これは例えば html 要素や、body 要素などに data-* を適当に生やしてデータを渡すというだけです。

<!DOCTYPE html>
<html
  data-user-id="[% user.id | html %]"
  data-user-name="[% user.name | html %]"
  >
...

<script>
alert(document.documentElement.getAttribute('data-user-id'));
</script>

こうすることで、変数のエスケープは常に HTML 用のをかけるだけですみます。これはすなわち、デフォルトでHTMLエスケープをするテンプレートエンジン (普通はそう) を使う場合には、余計なエスケープの心配をする必要が一切なくなります。意図的にミスしようとしない限りミスれないので安全です。

data-* を付ける要素

data-* を付ける要素は、なんでもいいですが、できるだけドキュメント上に早く登場するほうがスクリプトから使いやすいです。

html 要素であれば、document.documentElement で簡単にアクセスできるし、スクリプト実行時には必ず存在するので変数の取得に関しては問題ありませんが、クローラーによっては先頭の n bytes をとってきて title 要素を抜き出すみたいなことをやっていたりするので、大量のデータを入れるには向かないようです (html 要素でええやん! と使いまくってたら mala さんに指摘されました)

body 要素でも、document.body で簡単にアクセスできるし便利なんですが、body 要素に到達するまでは変数の読みとりができない点に注意する必要があります。どうしても header 要素内の script 要素で読みこんでいる JS の中で同期的に変数を読みとりたい! という場合は使えないことになります。

当然、他の要素でも data-* をつけることはできるので、ついでにつけておいて取得するようなこともよくやっています。

構造化データは?

頑張って展開して埋めこむか、専用の API を作ってあとから読みこむのが一番安全だと思います。どうしてもやりたいときだけ従来の方法を非常に注意して使うとかしかなさそうです。

2012年 10月 10日



関連エントリー (画像)

gerry++

2012年 10月 09日




関連エントリー (画像)

TAMRON SP24-70mm F2.8 Di VC USD (A700) と Canon EF100mm F2.8Lマクロ IS USM を持って昭和記念公園に行ってみたけれど、使い比べてみるとだいぶ違うなあと思った。ただこれが画角によるものなのか、性能によるものなのかハッキリしない。100mm の画角がそもそも長いこと使っていてすごく使いやすく感じている (普段の写真用の目の画角を100mmぐらいに設定しまっている) のもあるだろうけど、100mm のほうが撮っていて楽しかった。

24-70 は意識的に、今まであまり使っていない 24-35mm らへんを使おうとしているけど、慣れていないのですぐ望遠側70mmにしてしまうことが多々あった。しかし 70mm で開放にしても、背景が割とうるさく感じるので、撮りかたを変えないと駄目だなと思った。100mm だと適当に撮っても気持ちいいんだけど、もっと頭を使わないとだめだ。

感動するとか、撮っててめちゃくちゃ楽しい! というレンズではない気がするけど、それは単に自分に腕がないことが実感できるだけなのだろうなと思うので、めげずに使っていきたい。70-200mm を買った直後も 100mm 前後しか使わないことはあったし、100mm を買ったときも 50mm との感覚の違いには大変困ったので、経験の問題だと思う。

人間の顔が写っている場合、ホワイトバランスを大きくいじれないので、あとから写真全体の雰囲気を変えるのが難しい。一つでも顔が写っている場合、それに最初に注目してしまうので、そもそも写真のホワイトバランスが鑑賞者に与える印象が薄い。顔が入った時点で、顔の印象が支配的になるので、もし現像プロセスで気をつけるとしたら、とにかく顔の印象だけで良く、それがどうにもならないのであれば、もうどうにもならない。そんなように思った。撮影時の技術はよくわからない。

人が写ってる写真を写真展とかで見ると、これは写真作品なのか、ともやもやする。それは当然もちろん間違いないのだけれど、顔の印象の大部分を支配するのは被写体の顔 (=DNA) だし、次に支配的な表情を生みだすのはコミュニケーション力であって、光を写す、写真そのものを使った表現ではないじゃないかと思ってしまう。

とはいえ、じゃあ他のものはなんなのか、例えば風景写真はどうなのかと考えてみても、それも自然を借りて写しているだけだし、なので単に自分が、「生まれもった才能」と「コミュニケーション力」というものを嫌っているというだけだと思う。

gerry++

gerry++