[PHP-users 1075] Re: 特定ファイル/ディレクトリへのアクセス拒否

Yasuo Ohgaki php-users@php.gr.jp
Sat, 4 Aug 2001 10:30:45 +0900


大垣です。こんにちわ。

> > > それと、連想配列の並び順に手をつけずに連結していますが、
> > > $HTTP_*_VARS の値が常にソートされる、という保証が無いなら
> > > ksort を適用させた上で連結したほうが良いと思います。
> >
> > PHPはGET,POSTの値を前から順番に初期化するのでこれに依存していま
す。サ
> > ンプルコードとしては十分と思ったのですが、不親切なのでHTTP_*_VARS
から
> > チェックする変数を$keysとして渡せる様に変更しておきました。
>
> ちょっと神経質になりすぎかも知れませんが...
>
>
> 次のような HTML があった場合、
>
> <form action='form1' method='get'>
>   <input type='hidden' name='n1' value='v1'>
>   <input type='hidden' name='n2' value='v2'>
>   ..
> </form>
>
> 次のどっちが返って来ても大丈夫なようにする必要があると思います。
>
> 1. http://www.example.co.jp/~user/script.php?n1=v1&n2=v2
> 2. http://www.example.co.jp/~user/script.php?n2=v2&n1=v1
>
> つまり、 HTML に現れた順番通りに query ができあがってるか、
> そうじゃない場合もあるか、を考えると 1 と 2 の場合があります。
>
> 今まで見たブラウザだと 1 の方法だけしか返って来ないんですが、
> 2 の形にしてはいけない、という仕様を見たことが無いので、
> (私が知らないだけかも。^^; ) やっぱり ksort した方が良いかも知れませ
ん。
>
>
> # むー。考え過ぎかな。

私が、関数を作るときに考慮不足だったと思います :)
元の関数は、ページプロパティーを設定・初期化・確認するクラスの一つのメ
ソッドだったので、他のメソッドで処理した部分を入れていなかったりした
為、zend.comに置いておいた初期のコードには単独で利用するには不具合が
色々在りました。

> # 無視してもらっても結構です。(^^;

現在載っているコードでは変数が初期化される順番に関係なく変数名・値を
チェックできるよう変更しておきました。特にクッキーの値を確認する場合は
このような変更が必須です。

使い方は
$keys = array('v3','v2','v1','v4'); // チェックする変数名を配列に入れ
る。($HTTP_*_VARSのkeyになります)
if (!check_user_vars($keys)) {
   print('ユーザーが変数・値を変更しました');
}
と言う形で、利用できます。

array_sort()を利用しなかった理由は、
1. チェックする変数を自由に設定できる方が便利
2. Associative Arrayを使うとパフォーマンスもOK。
  配列要素を含む変数値の数に対してO(n)なのでこれ
  で良いかなと思っています。
と思ったからです。

# $keys内の変数名はmd5() hashを作るときの順番
# と同じである必要があります。$keysが指定された場合、
# プログラマが指定した$keysの順番にmd5()用の文字列
# が作られます。$keysが指定されている場合は、ブラウザ
# が送ってくる順番に依存しません。

実際に利用される場合は
function get_query_str($protected_get_vars, $magic) {
$str = '';
foreach($protected_get_vars as $k => $v) {
 if (is_array($v)) {
    foreach($v as $vv) {
      $str .= $k.'[]='.$vv.'&';
    }
  }
  else {
    $str .= $k.'='.$v.'&';
  }
}
$md5 = md5($str.$magic);
$str .= $str.'&'.$md5;
return array($str, $md5);
}

と言う感じの関数を作成されておくと便利と思います。
check_user_vars()の様に$keysを使って、特定の変数のみでmd5 hashを作成す
るようにすると更に便利と思います。この関数は読みやすさを優先してURL
encodeをしていません。必要に応じてURL encodeして下さい。
# 今書いた関数なので、Typo等には寛容にお願いします。

http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2
http://www.php.net/manual/en/function.urlencode.php
http://www.php.net/manual/en/function.rawurlencode.php

--
Ohgaki, Yasuo (大垣 靖男) 
Mail: yohgaki@dd.iij4u.or.jp