nkjmkzk.net

powered by Kazuki Nakajima

Archive for 5月, 2012

Salesforce Mobile SDK

先日Salesforce Mobile SDKのセミナーをオンライン、オフラインで開催しました。

そのビデオとスライドを公開しましたのでよろしければチェックしてみてください。iOSネイティブとPhonegapを用いたHybridアプリをSalesforce Mobile SDKで開発する手順を解説しています。

Salesforce Mobile SDK Webinar

スライド

without comments

Written by 中嶋 一樹

5月 19th, 2012 at 1:28 pm

Posted in Uncategorized

Tagged with , , ,

Apexでの入出力値チェック

Visualforceでは標準でHTMLENCODE(), JSENCODE()等の関数が提供されていますが、Apexではこれらに相当する機能が標準では提供されていません。

Apexでも文字列をエスケープ/エンコードする必要がある場面はでてくるわけですが、そういう場合はOWASPに準拠したForce.com ESAPIを利用することができます。

Force.com ESAPI

ESAPI(Enterprise Security API)とは、入力文字列のエスケープ、出力文字のエンコーディングおよびオブジェクトのアクセス制御を実装するためのライブラリです。このライブラリを使えばユーザーからの入力文字列のエスケープ処理等を自前制作する必要がなくなり、より信頼性の高いエスケープ実装をout of the boxで利用することができます。

ISVの皆様がForce.com上でアプリを販売いただくにはSecurity Reviewにパスする必要がありますが、そのSecurity ReviewではXSS対策として入出力値チェックが適切に施されているかどうかは必ず確認します。

このとき、自前のロジックでは完全にエスケープしきれていないことがしばしばありますし、そもそもそんなコードを書くのはひどく面倒です。

ESAPIのようなライブラリは是非積極的に活用して楽してセキュアなコーディングをEnjoyしたいものですね。

without comments

Written by 中嶋 一樹

5月 19th, 2012 at 1:17 pm

Posted in Uncategorized

Tagged with , ,

新しくなったForce.com OAuth Toolkit for phpの使い方

先日、Force.comのREST APIをphpから利用する際に便利なOAuth Toolkitを抜本的に書き直しました。新しくなってさらに簡単になったこのツールの使い方をご紹介しておきます。

まずはダウンロード。こちらからどうぞ。Webサーバの適当なディレクトリに保存してください。

https://github.com/nkjm/Force.com-OAuth-Toolkit-for-PHP

次に認証が必要なスクリプトにoauth.phpをインポートします。

$ vi index.php
require_once 'oauth.php';

同スクリプトでoauthクラスのインスタンスを作成します。

$oauth = new oauth(CLIENT_ID, CLIENT_SECRET, CALLBACK_URL, [LOGIN_URL], [CACHE_DIR]);
  • LOGIN_URLとCACHE_DIRはオプショナルです。
  • CACHE_DIRは認証後に発行されるaccess token, refresh token, instance urlを保存するためのディレクトリです。auth_with_password()を用いた場合のみ利用されます。

oauthのインスタンスメソッドでOAuth認証を実施します。認証には2通りあります。1つはアクセスコードを用いる方法で、ユーザごとに認証を要する場合に利用します。

$oauth->auth_with_code([LIFETIME]);

LIFETIMEはオプショナルで、アクセストークンをリフレッシュする間隔を分単位で指定できます。

もう1つはusername/passwordを用いる方法で、不特定のユーザからアクセスを受け付ける場合に利用します。HomePageのバックエンドとしてForce.comを接続し、問い合わせ情報などをForce.comに取り込みたい場合などに適しています。

$oauth->auth_with_password(USERNAME, PASSWORD);

USERNAME, PASSWORDはあるユーザをゲストアカウントと見たてて、その情報をセットします。

認証が成功すると$oauthには下記のパラメータにそれぞれaccess token, refresh token, instance urlの情報がセットされ、この情報を使ってREST APIにアクセスできます。

  • $oauth->access_token
  • $oauth->refresh_token
  • $oauth->instance_url

oauth_with_password()を使用する場合は事前にCACHE_DIRにしているディレクトリ(デフォルトではスクリプトと同じディレクトリ)が存在し、適切なパーミッションが設定されている必要があります。パーミッションはWebサーバプロセスのオーナーユーザー/グループの(一般的にはnobodyなど)からのRead/Writeアクセスが必要です。

OAuth Toolkitのセットアップと実行はこれだけです。

下記のサンプルコードで全体の流れをつかんでいただければ幸いです。

require_once "oauth.php";

// You have to change following paramenter depending on your remote access setting.
define('CLIENT_ID', '3MVG9rFJvQRVOvk40dRq5u_ZA0eT2KvZCvZq.XeA1hFtgc3PITGlLMp3V_kKIwtc6IaEGWkIO3cOu0IgVmujh');
define('CLIENT_SECRET', '1136279981407985294');
define('CALLBACK_URL', 'https://sugoisurvey.nkjmkzk.net');

$oauth = new oauth(CLIENT_ID, CLIENT_SECRET, CALLBACK_URL);
$oauth->auth_with_code();

$query = "select name from session__c";
$url = $oauth->instance_url . "/services/data/v24.0/query?q=" . urlencode($query);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Authorization: OAuth " . $oauth->access_token));
$response = json_decode(curl_exec($curl), true);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ( $status != 200 ) {
    die("curl failed");
}
curl_close($curl);
return($response);

with 2 comments

Written by 中嶋 一樹

5月 15th, 2012 at 1:50 pm

Posted in Uncategorized

Tagged with , ,

SSL証明書を購入してみた。

世は金色週間まっただ中ですが、私はSSL証明書を購入するなどしています。デモサイトをSSLで作った際に、「あれ、なにも見えないよ?」「いや、それはセキュリティ警告を無視してだな」という会話に疲れてきたので金で解決することにしたのです。

今回選んだのはRapid SSLというSSL証明書。SSL証明書といえばベリサインが有名ですが、個人が買うにはToo Muchでしょう。Rapid SSLは年間2600円という低価格から提供されており、さらに申請してから速攻で証明書が手に入るという代物です。

2600円のタイプは単一ドメインにのみ適用可能で、*.nkjmkzk.netといったワイルドカードには対応していません。nkjmkzk.netにはサブドメインがいくつもあるので本来ならワイルドカード対応版がのぞましいのですが、価格が18000円まで跳ね上がってしまいます。よっぽどサブドメインだらけじゃないかぎりは単品追加購入が吉だと思われます。

また、Force.comからHTTP Calloutで外部サービスへSSL接続する際には、自前署名SSL証明書は使えません。そういうことをするときもオフィシャルなSSL証明書が必要になります。今回のRapid SSLはForce.comからの接続でも問題なく動作しています(中嶋調べ)。

そのRapid SSLの申請、導入作業がやたら簡単&スピーディだったのでご紹介しておきます。私はNginx + OpenSSLという環境なのでその前提で手順を紹介します。

CSRを作成する

まず適当なディレクトリを作成&移動

$ mkdir /srv/nginx/conf/rapid-ssl
$ cd /srv/nginx/conf/rapid-ssl/

こちらのコマンド一発で鍵とCSR(証明書のリクエストファイル)を作成できます。

$ openssl req -new -newkey rsa:2048 -nodes -keyout demo.nkjmkzk.net.key -out demo.nkjmkzk.net.csr

できあがったCSRをオーダーフォームにペーストして申請。Paypalで男らしく前払いします。
https://www.rapid-ssl.jp/ssl/orderForm.php

今回は1時間もしない内に確認メールが送られてきて、誘導されたURLで承認ボタンを押したらメールでCRT(証明書)が送られてきました。

サーバを設定する

送られてきたCRTをサーバ上に保存します。vi等でファイルを作成してメールのCRTをペーストすればOK。

$ vi demo.nkjmkzk.net.crt
ペースト

中間証明書を保存します。Rapid-SSLの場合はこの辺を使うといいらしい。

https://www.slogical.co.jp/ssl/files/chainfile_rapidssl.txt

上記ファイルをまたコピー&ペーストします。

$ vi intermediate.crt
ペースト

自分のCRTと中間証明書を合体させます。

$ cat demo.nkjmkzk.net.crt intermediate.crt > demo.nkjmkzk.net.chain.crt

Nginxの仮想ホスト設定でCRTと鍵ファイルを指定します。

$ vi /srv/nginx/conf/nginx.conf
    server {
        server_name     demo.nkjmkzk.net;
        listen          443 default ssl;
        ssl on;
        ssl_certificate /srv/nginx/conf/rapid-ssl/demo.nkjmkzk.net.chain.crt;
        ssl_certificate_key /srv/nginx/conf/rapid-ssl/demo.nkjmkzk.net.key;
        access_log      /var/log/nginx/demo.nkjmkzk.net.log main;
        index           index.php;
        root            /srv/nginx/html/demo/public;
        location ~ \.php$ {
            fastcgi_pass        127.0.0.1:8080;
            fastcgi_index       index.php;
            include             fastcgi.conf;
            fastcgi_param       SCRIPT_FILENAME /srv/nginx/html/demo/public/$fastcgi_script_name;
        }
    }

Nginxを再起動します。

$ sudo service nginx restart

完了。

 

結果

これまで10年以上感じていたなんとなく後ろめたい気持ちがなくなりました。

 

without comments

Written by 中嶋 一樹

5月 2nd, 2012 at 11:22 am

Posted in Uncategorized

Tagged with , ,