Warning!!! 下記は全部間違ってました!
罵声を浴びせてからこちらへ → CSRF対策俺ルール2

CSRF クロスサイトリクエストフォージェリ – SpecIII – てけとうなWeb開発者の雑記

CSRFはサイトに対する正規のユーザーの権限を利用した攻撃です。
あるサイトのある処理を行うページに正規のユーザーを誘導し、強制的に望まない処理を発生させます。

CSRF(クロスサイトリクエストフォージェリ)
この間の勉強会でgorouさんとかが言っていてわかんなかったので調べました。

forgeryは偽造の意味なので「サイト横断的リクエスト偽造」でしょうか。
内容的には↓こうだそうです。

CSRFはサイトに対する正規のユーザーの権限を利用した攻撃です。
あるサイトのある処理を行うページに正規のユーザーを誘導し、強制的に望まない処理を発生させます。

具体的には記事の編集や削除といった機能を持つページのURLをダミーのリンクに埋め込んで踏ませたり、imgタグのsrcとして指定して知らず知らずのうちにアクセスさせます。特に後者の例ではユーザーが全く気がつかぬうちに攻撃が完了します。

JavaScriptでGETやPOSTができる以上、根本的な対策が難しそうです。
どう対応するか自分ルールを決めておくことにします。

CSRF対策俺ルール:

  • 本気で防ぎたい場合:CAPTCHA
  • ユーザビリティ優先の場合:全部POST&セッション&リファラーチェック(7/7追加)

Byecycle – Aesthetic Programming for Eclipse

logobyecycle.gif

Byecycle is an auto-arranging dependency analysis plug-in for Eclipse.

クラスの依存関係を表示するEclipseプラグイン。
可視化してくれると依存関係を減らすのが楽しくなっていいかも!こんな風に小ネタをすぐにEclipseプラグイン化できるようになりたい。

PECL :: Package :: ssh2

Provides bindings to the functions of libssh2 which implements the SSH2 protocol. libssh2 is available from http://www.sourceforge.net/projects/libssh2

libssh2のPHPバインディング。これ知っておくと仕事で要件を意外な方法で片付けたりできる場面がある・・・気がする!

Trackbackサーバを書いたんですがXMLがちょっと面倒くさい。
そこでRESTより簡単なRPCを考えてみました。

サーバ:

<?php
echo var_export(array("foo", "bar", "buz"));
?>

クライアント:

<?php
function var_export_rpc($uri) { return eval('return '.file_get_contents($uri).';'); }
var_dump(var_export_rpc("http://localhost/workspace/samples/var_export_rpc_server.php"));
?>

VAR_EXPORT_RPC

XMLじゃなくてPHPコードを返す。
クライアントがPHPじゃないと死ぬほど面倒なことになる方式です。(Webサービスの利点台無し)
あぁ、しかもオブジェクト渡せない・・・。

この間やった内部勉強会の資料をアップしました。

基礎Mojavi(2) ~ValidationとLogging~

基礎Mojavi(2)サンプルアプリ

この間の続きを面倒臭いながら実装中。

Accept-Languageヘッダフィールドの書式はRFC2616のSection14で定義されてるようです。

[RFC 2616] Hypertext Transfer Protocol—HTTP/1.1

Each language-range MAY be given an associated quality value which represents an estimate of the user’s preference for the languages specified by that range. The quality value defaults to ””q=1””. For example,

Accept-Language: da, en-gb;q=0.8, en;q=0.7

なるほど。これにそってgetLocales, getLocaleを実装してみました。

<?php
class RequestUtil {
    function getLocale() {
        return array_shift(RequestUtil::getLocales());
    }

    function getLocales() {
        foreach (split(",", $_SERVER["HTTP_ACCEPT_LANGUAGE"]) as $value) {
            list($name, $pri) = split(";", trim($value));
            $num = preg_replace("/^q=/", "", $pri);
            $langs[($num ? $num : 1)] = $name;
        }
        arsort($langs);
        foreach ($langs as $value) {
            $locales[] = $value;
        }
        return $locales;
    }    
}
?>

Firefoxでは仕様通りこんなのが来るのでちゃんと取れます。

ja,en-us;q=0.7,en;q=0.3

IEではこんな感じ。

ja

quality valueを省略した場合は1ということになっているのでこれも問題なさそう。

でもOperaのこれは間違ってないのかな

ja, en

両方1だとどちらを選んでいいのかわからない!
現在の実装だと上記の場合、getLocale()はenが返って来てしまいます。かといって左側優先なんてルールを勝手に実装したくない。

・・・と書いていたらyoshukiさんから情報が。

[RFC 3282] Content Language Headers

The syntax and semantics of language-range is defined in [TAGS]. The Accept-Language header may list several language-ranges in a comma- separated list, and each may include a quality value Q. If no Q values are given, the language-ranges are given in priority order, with the leftmost language-range being the most preferred language; this is an extension to the HTTP/1.1 rules, but matches current practice.

If Q values are given, refer to HTTP/1.1 [RFC 2616] for the details on how to evaluate it.

Accept-LanguageヘッダはRFC3282で再定義されていてquality valueが無い場合は左優先となっているそうです!

さっそくさっきのヤツを左優先に修正。

<?php
class RequestUtil {
    function getLocale() {
        return array_shift(RequestUtil::getLocales());
    }

    function getLocales() {
        foreach (<strong>array_reverse(</strong>split(",", $_SERVER["HTTP_ACCEPT_LANGUAGE"])<strong>)</strong> as $value) {
            list($name, $pri) = split(";", trim($value));
            $num = preg_replace("/^q=/", "", $pri);
            $langs[($num ? $num : 1)] = $name;
        }
        arsort($langs);
        foreach ($langs as $value) {
            $locales[] = $value;
        }
        return $locales;
    }    
}
?&gt;

これで安心です。

web kikaku

「世界政府っていうものが仮にあるとして、そこで開発しなければならないはずのシステムは全部グーグルで作ろう。それがグーグル開発陣に与えられているミッションなんだよね」

グーグルに勤める友人は私にこう言った。

それでGoogle Earthか!

SourceForge.net: Project Info – AwesomeFramework

This is PHP application framework of an extremely simple Plain Old PHP File base. It is possible to use it for not only a browser but also the command line application.

1行のフレームワークAwesomeFrameworkをsourceforge.netにプロジェクト登録しました。

POPFとか勝手に言っていいのかよ!
プロジェクト申請を通すために大層なこと書いてるけどソースは1行。嘘は言ってないからよしとします!

AwesomeFramework-0.4のソース:

&lt;?php include $_SERVER["argv"][1] ? preg_replace('/^--action=/', "", $_SERVER["argv"][1]) : ($_GET["action"] ? $_GET["action"] : 'default.php'); ?&gt;

しかし、この1行から恐るべき機能の数々が(実装したじゃなくて)発見されたので次の勉強会のネタはこれで行こうかと。

AwesomeFrameworkをコマンドラインに対応させました。

AwesomeFramework-0.3.zip

&lt;?php
forward($_SERVER["argv"][1] ? preg_replace("/^--action=/", "", $_SERVER["argv"][1]) : ($_GET["action"] ? $_GET["action"] : "default"));
function forward($action) { include $action.".php"; }
?&gt;
php index.php --action=action

なんて高機能なんだ。
コマンドラインから実行できるということは・・・Mojavi3超えたっっっ!?

AwesomeFrameworkにForwardを実装しました。

AwesomeFramework-0.2.zip

&lt;?php
include $_GET["action"] ? $_GET["action"].".php" : "default.php";
function forward($action) { include $action.".php"; }
?&gt;

なんて高機能なんだ。
これでViewにforwardすることでModelとViewとControllerがそろってると言えるのではないだろうか!!

AwesomeTemplateEngineと同様、PHPファイル自体をテンプレートとして使用しますがAwesomeFrameworkはあくまで、$GLOBALS経由でテンプレートに値を渡します!

Actionのファイル:

&lt;?php
$GLOBALS["message"] = "World";
forward("view");
?&gt;

Viewのファイル:

Hello &lt;?=$GLOBALS["message"]?&gt;!

あと、今思いついたんですが、

module/
 action.php
index.php
index.php?action=module/action

ってやってモジュールによって管理する機能搭載!とか言えないでしょうか・・・。