Home > Archives > 2006年06月

2006年06月

王様のブランチにサイボウズ・ラボが登場!?

  • 2006-06-19 (月)

すでに秋元さんのブログで発表されていますが、TBSの「王様のブランチ」という番組の収録にサイボウズ・ラボオフィスが使われました。放送自体は6/17(土)にすでに行われており、iPodの活用方法を紹介するコーナーで使われました。

撮影に使われると、タレントさんにもお目にかかれるので、ドラマの撮影とかにも使って欲しいな。以前、本社のオフィスも anego というドラマの撮影に使われたことがあります。

ところで、cybozu.net社の社長でもあるECナビの社長の宇佐美さん山口もえの結婚式に出席したなんてうらやましい。

  • Comments (Close): 0
  • TrackBack (Close): 0

[図書管理システム]FireFox 1.5.0.4 での不具合

  • 2006-06-13 (火)

図書管理システムにおいて、ブックマークレットからの書籍情報の登録において、不具合がありました。

具体的には、ブックマークレットに問題はなかったのですが、FireFox 1.5.0.4 (おそらく、1.5.0.x でも同様と思われる)では2006年5月中旬頃に発生したと思われる amazon の書籍ページのURLの変更が変更されていなかったために起こりました。つまり、IE および FireFox 1.0.x では amazon の書籍ページのURLが

変更前のURL:http://www.amazon.co.jp/exec/obdos/ASIN/(ASINコード)

変更後のURL:http://www.amazon.co.jp/gp/product/(ASINコード)

と変更していたのですが、FireFox 1.5 では変更前のURLが使われていたため、前回の修正を機に動作しなくなっておりました。

したがいまして、古いURLにも対応するように修正しました。

なお、この修正に伴うブックマークレットの更新は必要ありません。

ご迷惑をお掛けしました。

  • Comments (Close): 0
  • TrackBack (Close): 0

CSRF対策 with JavaScript

  • 2006-06-09 (金)

JavaScript を使った CSRF 対策の方法として、以前 Kazuho@Cybozu Labs で紹介されました。

CSRF 対策 w. JavaScript

CSSXSS に対して脆弱でない CSRF 対策とはどのようなものか、という議論が続いているようですが、JavaScript を用いてよいのであれば、簡単な対策手法が存在すると思います。

ここでさらに一歩進めて、既存の FORM 要素に onsubmit 属性、および hiddenフィールドを直接追加せずに、JavaScript ファイルを1つインクルードすることにより、既存アプリケーションの書き換えをさらに少なくする方法を紹介したいと思います。

以下の JavaScript ファイルをHTMLの最後でインクルードする方法です。

fight_csrf.js

sessid_name = "";
scripts = document.getElementsByTagName("script");
len = scripts.length;
for (i = 0 ; i < len ; i ++) {
    if (scripts[i].src.indexOf("fight_csrf.js") != -1) {
        a = scripts[i].src.split("#");
        if (a.length > 1) sessid_name = a[1];
        break;
    }
}
data = document.cookie + ";";
start = data.indexOf(sessid_name + "=");
end = data.indexOf(";", start);
value = data.substring(start + sessid_name.length + 1, end);
forms = document.forms;
len = forms.length;
for (var i = 0 ; i < len ; i ++) {
    var form = forms[i];
    if (form.method == "post") {
        var sessid = document.createElement("input");
        sessid.type = "hidden";
        sessid.name = sessid_name;
        sessid.value = value;
        form.appendChild(sessid);
    }
}

HTML の最後でインクルードする記述は、以下のような感じです。

<form method="post" ...>
...
</form>
...
<script type="text/javascript" src="fight_csrf.js#SESSID"></script>
</body>
</html>
SESSID の部分を、Cookie に保存されているセッションIDのCookie名にしてください。

JavaScript 内で行っていることは、

  1. インクルード元の script タグの src 属性の値の # 以降の値から、セッションIDのCookie名を取得する

  2. Cookie からセッションIDを取得する

  3. ドキュメント上の全てのPOSTフォームに name 属性がセッション名となる hidden フィールドを追加し、value 属性にセッションIDを代入する

  4. POSTされた際には、セッションIDがサーバー側に送信される。

JavaScript で hidden フィールドを生成しているので、CSSXSS によって第三者にページが読まれたとしても、セッションIDが流出することはありません。

たいていのアプリの場合は、フッタとかは共通のテンプレートを使用していると思うので、そのテンプレートに上記の JavaScript ファイルのインクルード文を挿入すれば、クライアント側の対応はこれだけで済ませられます。

後はサーバー側で送信されたセッションIDをチェックしればOKです。PHPを例にすると、以下のような感じです。

<?php
session_start();
if (count($_POST)) {
    // counter to CSRF
    $sessid_name = sessin_name();
    if (! isset($_POST[$sessid_name]) || session_id() != $_POST[$sessid_name]) {
        trigger_error('Invalid request.', E_USER_ERROR);
    }
    ...
}
...
?>

なお、CSRF対策にセッションIDを送信する方法については、高木浩光@自宅の日記に詳しく書かれてありますので、そちらを参照して頂ければと思います。

  • Comments (Close): 0
  • TrackBack (Close): 0

DirectSmarty : PHP で .php ファイルと Smarty のファイルを1つにまとめる方法(2)

  • 2006-06-08 (木)

先々月に「PHP で .php ファイルと Smarty のファイルを1つにまとめる方法」というのを紹介しました。

PHP で .php ファイルと Smarty のファイルを1つにまとめる方法の紹介です。

PHP でテンプレートとして Smarty を使用すると、PHPファイルの他にSmartyのテンプレートファイルが必要となる。通常はそれでかまわないのであるが、何らかの事情により、「Smarty は使いたい、でもファイルは1つにまとめたい」というような場合に、1つにする方法があります。

しかし、自分としては、PHPスクリプトの途中で $tpl = にテンプレートの内容を代入して、その後 Smarty::display('var:'.$tpl) を呼び出すのは、PHP スクリプト → Smarty テンプレート → PHP スクリプト、という順序になり、あまり美しくないと思っていました。

そこで、これを PHP スクリプト → Smarty テンプレート、で完結できるように Smarty のクラスから派生させて DirectSmarty というクラスを作ってみました。

directsmarty.class.php (PHP License)

DirectSmarty を使うと以下のような感じで PHP スクリプト、および Smarty テンプレートが記述できます。

<?php
// まずは、PHP スクリプト
rquire_once 'directsmaty.class.php';

$message = 'DirectSmarty';

$t = new DirectSmarty;
$t->assign('message', $message);
$t->displayDirect();

// ここから Smarty テンプレート
?>
<html>
<head>
<title>Hello {$message|escape}</title>
</head>
<body>
<h1>Hello {$message|escape}</title>
</body>
</html>

いかがでしたでしょうか。役に立ちそうでしょうか。

次にやりたいのは、PHP スクリプトの部分で定義した変数、上記の例で言うと $message、を自動的に Smarty オブジェクトに assign() したいなあと思っています。良い方法を思いついたら紹介したいと思います。

  • Comments (Close): 0
  • TrackBack (Close): 0

Home > Archives > 2006年06月

Search
Feeds

Page Top