LOGIN ID Password Auto Login Register Now! Lost Password?
XUGJ Forum

urlencode されていないクエリが含まれる時の問題

  • このフォーラムに新しいトピックを立てることはできません
  • このフォーラムではゲスト投稿が禁止されています
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-8-25 23:10
nao-pon  Chief Officer 登録日: 2006-9-29   投稿数: 110
SF.net のトラッカー( http://sourceforge.net/tracker/index.php?func=detail&aid=2073613&grou... )にも上げましたが、英語がとても苦手なため補足しておきます。

fuga さん達と一緒に突っついている OpenID モジュールで fuga さんが Mixi 対応したときに見つけた問題です。

"Legacy_Controller.class.php" と
"Legacy_PublicControllerStrategy.class.php" にて、$_SERVER['REQUEST_URI'] を parse_url() で処理しているのですが、parse_url() では URI のみでは、正常に処理できない場合があるようです。

例えば、GETクエリーが "XOOPS_URL/index.php?http://" であった場合に、parse_url($_SERVER['REQUEST_URI']) は失敗して FALSE を返します。("http://" が URLエンコードされていれば問題はない。)

そこで、自分なりに次のように変更してみたところ、なんとなく上手くいっているようです。

Legacy_Controller.class.php, Line:383 -

//$requestPathInfo = parse_url($_SERVER['REQUEST_URI']);
//$requestPath = isset($requestPathInfo['path']) ? urldecode($requestPathInfo['path']) : '';
$requestPathInfo = explode('?', $_SERVER['REQUEST_URI']);
$requestPath = urldecode($requestPathInfo[0]);

Legacy_PublicControllerStrategy.class.php, Line: 43 -

//$pathArray = parse_url(xoops_getenv('REQUEST_URI'));
//$mid = preg_match("#(/index\.php|/)$#i", @$pathArray['path']) ? -1 : 0;
$pathArray = explode('?', xoops_getenv('REQUEST_URI'));
$mid = preg_match("#(/index\.php|/)$#i", $pathArray[0]) ? -1 : 0;

検証をよろしくお願いします。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-8-26 0:49 | 最終変更
Marijuana  Warrant Officer 登録日: 2006-10-30   投稿数: 179
修正入れないとデバグモードオフで真っ白ですね。

クエリーやPATHINFOまで含める必要はないと思うので
$requestPathInfo = parse_url(str_replace(@$_SERVER['PATH_INFO'], "", $_SERVER['PHP_SELF']));

$pathArray = parse_url(str_replace(@$_SERVER['PATH_INFO'], "", $_SERVER['PHP_SELF']));
でいいんじゃないかなぁ

うちのサイトを上記に変更してみましたが問題なさそうです。

css.phpの時は定数にしちゃいましたが、リクエストファイルを取得する関数とか作ってもいいのかもしれないですね。
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-8-26 5:16
GIJOE  Admiral 登録日: 2006-3-20   投稿数: 3708
PATH_INFOを除いたPHP_SELF、という手段、良さそうですね。

引用:

Marijuanaさんは書きました:
css.phpの時は定数にしちゃいましたが、リクエストファイルを取得する関数とか作ってもいいのかもしれないですね。
これ、本当に欲しいです。
リクエストファイルが欲しい状況はいくらでもあるのですが、その都度、いちいち同じコードを書かなくちゃいけないので。

もっとも、XCLだけに実装されても、私には利用できない…
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-8-27 14:08
nao-pon  Chief Officer 登録日: 2006-9-29   投稿数: 110
SCRIPT_NAME は、PATH_INFO が含まれないようなので、

$requestPathInfo = parse_url($_SERVER['SCRIPT_NAME']);



$pathArray = parse_url($_SERVER['SCRIPT_NAME']);

でいけそうですが、SCRIPT_NAME が正しく取得できない環境があったような、なかったような・・・
投票数:0 平均点:0.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2008-9-4 4:24 | 最終変更
GIJOE  Admiral 登録日: 2006-3-20   投稿数: 3708
引用:

nao-ponさんは書きました:
SCRIPT_NAME が正しく取得できない環境があったような、なかったような・・・
はい。CGI版では、"/cgi-bin/php" などとなるケースがあります。

* REQUEST_URI
IISでは設定されない。ただし、これが設定されてない環境でも、common.phpの処理で設定し直されるので、common.php以降の処理であれば利用可能

* PHP_SELF
CGI版でもIISでも正しく設定される。ただし、PATH_INFOを含むので、それを外す必要がある。

* SCRIPT_NAME
CGI版では実際に処理する実行可能スクリプトとなるケースがある。(suPHPな環境ではおそらく大丈夫)


Marijuanaさんのコードはそれをふまえて、PHP_SELFから生成しています。
投票数:1 平均点:10.00
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2008-9-4 9:21
nao-pon  Chief Officer 登録日: 2006-9-29   投稿数: 110
GIJOE さん、とても分かりやすい解説をありがとうございました。

またひとつ賢くなりました。
投票数:0 平均点:0.00

  条件検索へ


Back to Page Top
MainMenu
Manuals
Search
XOOPS Official & Dev.
XOOPS Communities