ラベル XREA の投稿を表示しています。 すべての投稿を表示
ラベル XREA の投稿を表示しています。 すべての投稿を表示

2009年12月7日月曜日

[XREA] PHP による .htpasswd の生成

今回は apache で会員用ページに認証をかける時、XREA/coreserver のコントロールパネルの .htpasswd の生成ツールと同じパスワードを出力する php スクリプトの紹介です。このスクリプトを使うことで、php のスクリプトで .htpasswd を作成できるようになります。

色々と調査してみたのですが、どうやら XREA/coreserver の .htpasswd 生成スクリプトでは標準 DES を用いているようですね。他の認証方式としては md5 等もありますが、同じ入力文字列に対して得られる出力結果(ハッシュ値)が固定なので、出力結果を比較することで同じパスワードが利用されているかどうかがばれてしまいます。一方、DES には平文に加え、salt(調味料ぐらいの意味?)というパラメータの組で一意の暗号化結果が得られるようになります。これにより、同じパスワードを暗号化しても、その都度 salt を変更すれば同じ出力結果になることを避けることができます。

標準 DES を用いた場合、平文に2文字の salt を与えます。また、出力結果の始め2文字にも salt 自身が示されます。例えば、XREA/coreserver でパスワード "a" を暗号化した場合、

aiDm98/1yAB/6

を得ました。この中の、始めの "ai" が salt に該当し、元のパスワード "a" と、salt "ai" の二つの組み合わせで暗号化すれば上記の "aiDm98/1yAB/6" が得られることになります。

php でこの標準 DES による暗号化を行うには、少なくとも XREA/coreserver 上では、$pass を平文、$salt を2字の文字列として

$r = crypt($pass, $salt);

とすれば、戻り値として暗号化結果が得られます。なお、php の crypt 関数は引数の状態(数や文字数)やオペレーティングシステムによって挙動が違うようなので、他の環境で完全に動作するかは未確認です。以上から、XREA/coreserver の出力結果を PHP からも再現したい場合、

echo crypt("a", "ai");

とすることにより、XREA/coreserver の .htpasswd 生成ツールと同じ結果が得られます。実行してみると、

aiDm98/1yAB/6

きちんと同じパスワードが得られていることが確認できました。

2009年11月3日火曜日

[XREA] 携帯サイトへリダイレクト

RewriteEngine を使って、携帯からのアクセスがあった場合に携帯ページへリダイレクトするコードを作ってみました。
XREA/Coreserver で動作を確認しています。

http://foo.bar/

がトップページで

http://foo.bar/mobile/

が携帯サイトだった場合、ドキュメントルートの .htaccess に以下のコードを記述。

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} (DoCoMo|Vodafone|J-PHONE|SoftBank|UP\.Browser|KDDI)
RewriteCond %{REQUEST_URI} !^/mobile/
RewriteRule ^(.*) http://foo.bar/mobile/ [L]

4行目で、携帯からのアクセスならあらゆる場合に /mobile/ に飛ぶようにしてますが/mobile/ の中にいる場合も /mobile/ に飛ぶと /mobile/ トップページに常に縛られるので、既に /mobile/ の中にいた場合だけ /mobile/ トップページに飛ぶのを除外するコードが3行目の !^/mobile/ です。
モバイルモバイル!

現在のところ上手く動いてる。ただ、ルートに置くと他の全ページに影響するんでバグがあった場合ちょっと怖いですね。