がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

PHP session関数群について

えっと。まず前提として、sessionで使える文字は限定されているっていうのがあります。 …いやまぁ、PHP4系(4.3.10、4.3.11、4.4.1 でチェック)はa-zA-Z0-9、PHP5系(5.0.4、5.1.1でチェック)はa-zA-Z0-9のほかに、カンマ,とハイフン−がOK、っていう微妙な差異があるのですが…まぁとにかく「OKな文字とNGな文字」ってのがあります。


4系のルーチン


for (p = key; (c = *p); p++) {
/* valid characters are a..z,A..Z,0..9 */
if (!((c >= 'a' && c <= 'z') ||
(c >= 'A' && c <= 'Z') ||
(c >= '0' && c <= '9'))) {
ret = 0;
break;
}
}
5系のルーチン

for (p = key; (c = *p); p++) {
/* valid characters are a..z,A..Z,0..9 */
if (!((c >= 'a' && c <= 'z')
|| (c >= 'A' && c <= 'Z')
|| (c >= '0' && c <= '9')
|| c == ','
|| c == '-')) {
ret = 0;
break;
}
}
………。閑話休題


で、まぁ。上述以外の文字が使われている場合、通常「アタック」であることが予想されるのですが。おかしな文字をセッションIDの文字列で用いられると、エラーをログに吐き出します。具体的には、 "The session id contains invalid characters, valid characters are only a-z, A-Z and 0-9" というメッセージでエラーを吐き出します。
さて。大抵通常当然のごとく、上述の「奇妙なCookie値が設定されてきた」などはプログラム上で捕捉したいと思うのが世の常人の常というものだと思うのですが。上述のログを吐き出しているのは、 php-X.X.X/ext/session/mod_files.c というファイルにある、ps_files_open という関数です。


static void ps_files_open(ps_files *data, const char *key TSRMLS_DC)


復帰値、void?これは「復帰で何も返さない」ことを意味します。で、肝心のチェック部分。


if (!ps_files_valid_key(key)) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The session id contains invalid characters, valid characters are only a-z, A-Z and 0-9");
return;
}
ご覧頂いてわかるとおり(C言語読めねぇよとかいう突っ込みはなしの方向で)、ステータス、なにも保存していません。この時点で「invalidが取得できない」事がほぼ確定します。
それ以外にもまぁ「基本的に認証系の機能欠けてるよねぇ」とか色々と突っ込みはあるのですが。


…え〜っと。取り合えず「僕は使ってない/自作で認証系のクラス実装してる」とだけ述べておきます(苦笑