PHPで携帯用サイトを作る際に,セッション情報を持たせるためにuse_trans_sidを設定し,URLの末尾にPHPSESSID=xxxxxx... という文字列をつけさせる処理はよく行われます.
しかしXHTMLで書いた携帯サイトをFireFoxで見たらXMLエラーが!
ソースを見てみると,GETパラメータの後に自動で付加される PHPSESSID が &PHPSESSID となっている.
本来だったら文字実体参照で &PHPSESSID となってほしい.
.htaccessに
php_value arg_separator.output '&'
と書いて解決.
もちろん
ini_set('arg_separator.output','&');
としても良い,はず.
■おことわり
・今更感があります
・もっと詳しい人がゴマンといます
先日,とあるwebサービスが流行の兆しを見せ始めたので,とりあえず自分も登録してみた.
そしたら登録完了メールに自分の入力したパスワードがバッチリ書いてある.
nackyさん,ようこそ○○へ!あなたのパスワードは MyPassWd です!
ということは,おそらくDB上には次のように記録されている.
+--------+--------+
|nacky |MyPassWd|
+--------+--------+
つまりこれ,webサービスの管理人が,見ようと思えばそのパスワードを見ることができるわけですよね.
通常DBにはwebサービス本体か管理者からしかアクセスできないようになっていると思いますが,それでもパスワードが平文でそのまんま入っているのは気持ちよくないです.
ユーザーによっては共通のパスワードを他のサービスでも使っていることがあるでしょうから,平文で見えちゃったら,その人が使ってる他のサービスにログインできちゃうことになります.
通常,パスワードは非可逆アルゴリズムを使って変換して格納されます.されるべきです.
(方法には色々あって利点欠点もありますがその話は別として)
例えばこんな風に格納されるはず.
+--------+--------+
|nacky |q9asbn4x|
+--------+--------+
格納後の文字列から元のパスワードを得ることができないのが非可逆なアルゴリズム.こうなると回数をこなしてアタックするしかパスワードを解析する方法はありません.
こういうある程度しっかりした方式をとっているサービスでは,ユーザーが入力したパスワードをメールで通知したりできません.だって元のパスワードを得る方法がないんだもの.
逆に,通知してくるサービスはパスワードが平文で登録されています.そういうサービスに他のサービスと同じパスワードを使うのは危険だと思います.
その程度のサービスを提供するところの管理者はその程度のモラルだ!と想像するともっと危険に思えてきます.
先日,とあるエンジニアが会員登録システムを作っていて,そのDBを見たらパスワードが平文で入っておりました.
再通知のときに困る等の運用面での問題もあるでしょうけど(とはいえ,再発行→変更の手続きを踏んでもらう手間をどう説明するか程度),それ以上に平文格納は問題だと思います.
(このときは他社さんでしたがすぐ直させました)
ユーザーの側からできることは少ないとは思うんですが,このへんの話を少しでも気にしておけば作る側も使う側もステップアップできるかなーと思います.
# この手の話はもう何回もいろんなところで繰り返されてるんだろうなぁと思いつつも,気になったのでまた書く
■
Webサイトがパスワードを可逆状態で保存しているかを見分ける10のポイント - Webと何かとその近所
■
ブログが続かないわけ | [PHP]パスワードのハッシュ化にはcrypt を使ってはいけない
■
万世橋テクノラジオ - 秋葉原からテクノを発信!
こちらのRSSがエラーになるのでおかしいなーといろいろ見た結果,本文の抜粋が途中で切れていて,UTF-8で表示できない文字になっていました.
日本語の関係だなーこりゃ.
<itunes:subtitle>~</itunes:subtitle>の間は本文の抜粋というか先頭何バイトかを切り取っているようで,切り取る部分がマルチバイトだと文字化けしてダメになっちゃうみたいです.
ということはpodpressでsubstrしてるところをmb_substrに変えてやればいいんでしょうけど,今回はそこまでやらずに,本文がちょうど切れるように,文中のスペースやハイフンで調整しました(消極的対応).
podpressはなんかあんまり積極的にメンテナンスされてなかったりして,ちょっと不安が残りますなー.
手元のCentOS5機でWake on Lan用のプログラムが動かない!
fsockopenでudp://192.168.x.255宛にMagicPacketを送る仕組みだったのですが,broadcastアドレス宛への送信はできない模様(permission deniedと言われます).
PHPというよりOSの制限?
fsockopenではなくsocket関数を使って次のように書いて解決.
$s=socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($s, SOL_SOCKET, SO_BROADCAST, 1);
// ↑SO_BROADCASTでブロードキャストを許可
socket_connect($s, $ip, $port);
socket_write($s, $packet);
socket_close($s);
(エラー処理とかは適宜.変数は適当に読み替えて)
デフォルトでできなくなっているのは容易にブロードキャストしてネットワークに負荷をかけないための措置なのでしょうから,慎重に.
PEARのCrypt_Blowfishは現在stableが1.0.1ですがcurrentは1.1.0RC1です.
1.1.0RC1では使える暗号形式が増えているのでそちらを使いたい場合,1.1.0RC1をインストールする必要があります.
パッケージをダウンロードしてきて展開しても良いですが,pearコマンドでインストールするには
> pear config-set preferred_state beta
(betaでもインストールできるようにセット)
> pear upgrade Crypt_Blowfish
(インストール)
> pear config-set preferred_state stable
(stableのみインストールするように戻す)
という感じで.
beta,stableの部分は他にもalpha,develが入ります.読んだとおりの意味.