GETを許可する | 2010-04-26 |
さて。
基本、POSTしか使えないようです。
GETも使いたいんですが、GET使える設定にすると・・・少し大変な事に。
config.phpで設定している「enable_query_strings」は、デフォルトFALSE。
これをTRUEにすれば、GET使えるんだけど・・・
これを見てる方たちなら、既にご存知かと思うので、そこは省略します。
ハッキリ言って、TRUEにする事は、オススメしません。
それでも、どうにかして、利用できるように出来ないかと思いまして。
どこで、GETがお亡くなりになってるのか、調べてみました。
どうやら、Inputクラスの、_sanitize_globalsというクラスが、GETを無かった事にしてるようです。
// Is $_GET data allowed? If not we'll set the $_GET to an empty array
if ($this->allow_get_array == FALSE)
{
$_GET = array();
}
else
{
$_GET = $this->_clean_input_data($_GET);
}
ちなみに、「allow_get_array」には、「enable_query_strings」の設定値が入っています。
あれ?これだけ?
そしたら、ここの処理を書き換えてしまえばいいのではないでしょうか?
ただ、もとのファイルを書き換えるのはナンセンスなので、継承します。
<?php
class MY_Input extends CI_Input {
function MY_Input()
{
parent::CI_Input();
}
function _sanitize_globals()
{
// Would kind of be "wrong" to unset any of these GLOBALS
$protected = array('_SERVER', '_GET', '_POST', '_FILES', '_REQUEST', '_SESSION', '_ENV', 'GLOBALS', 'HTTP_RAW_POST_DATA',
'system_folder', 'application_folder', 'BM', 'EXT', 'CFG', 'URI', 'RTR', 'OUT', 'IN');
// Unset globals for security.
// This is effectively the same as register_globals = off
foreach (array($_GET, $_POST, $_COOKIE, $_SERVER, $_FILES, $_ENV, (isset($_SESSION) && is_array($_SESSION)) ? $_SESSION : array()) as $global)
{
if ( ! is_array($global))
{
if ( ! in_array($global, $protected))
{
unset($GLOBALS[$global]);
}
}
else
{
foreach ($global as $key => $val)
{
if ( ! in_array($key, $protected))
{
unset($GLOBALS[$key]);
}
if (is_array($val))
{
foreach($val as $k => $v)
{
if ( ! in_array($k, $protected))
{
unset($GLOBALS[$k]);
}
}
}
}
}
}
// Is $_GET data allowed? If not we'll set the $_GET to an empty array
if ($this->allow_get_array == FALSE)
{
/**
* ここをFALSEの場合でも、$_GETの値を取得できるようにすれば良さそう
*/
//$_GET = array();
echo 'これは、継承したクラスです';
$_GET = $this->_clean_input_data($_GET);
}
else
{
$_GET = $this->_clean_input_data($_GET);
}
// Clean $_POST Data
$_POST = $this->_clean_input_data($_POST);
// Clean $_COOKIE Data
// Also get rid of specially treated cookies that might be set by a server
// or silly application, that are of no use to a CI application anyway
// but that when present will trip our 'Disallowed Key Characters' alarm
// http://www.ietf.org/rfc/rfc2109.txt
// note that the key names below are single quoted strings, and are not PHP variables
unset($_COOKIE['$Version']);
unset($_COOKIE['$Path']);
unset($_COOKIE['$Domain']);
$_COOKIE = $this->_clean_input_data($_COOKIE);
log_message('debug', "Global POST and COOKIE data sanitized");
}
}
/* End of file welcome.php */
デバッグ入れてます。
条件分岐、いらねぇじゃんというツッコミは無しで。
これで、GETとPOSTの両方を使えるようにはなりました。
こんなんで、どうですかね?
もし使ってみて、変な箇所あれば、コメント頂けると幸いです。
ご参考までに。
基本、POSTしか使えないようです。
GETも使いたいんですが、GET使える設定にすると・・・少し大変な事に。
config.phpで設定している「enable_query_strings」は、デフォルトFALSE。
これをTRUEにすれば、GET使えるんだけど・・・
これを見てる方たちなら、既にご存知かと思うので、そこは省略します。
ハッキリ言って、TRUEにする事は、オススメしません。
それでも、どうにかして、利用できるように出来ないかと思いまして。
どこで、GETがお亡くなりになってるのか、調べてみました。
どうやら、Inputクラスの、_sanitize_globalsというクラスが、GETを無かった事にしてるようです。
// Is $_GET data allowed? If not we'll set the $_GET to an empty array
if ($this->allow_get_array == FALSE)
{
$_GET = array();
}
else
{
$_GET = $this->_clean_input_data($_GET);
}
ちなみに、「allow_get_array」には、「enable_query_strings」の設定値が入っています。
あれ?これだけ?
そしたら、ここの処理を書き換えてしまえばいいのではないでしょうか?
ただ、もとのファイルを書き換えるのはナンセンスなので、継承します。
<?php
class MY_Input extends CI_Input {
function MY_Input()
{
parent::CI_Input();
}
function _sanitize_globals()
{
// Would kind of be "wrong" to unset any of these GLOBALS
$protected = array('_SERVER', '_GET', '_POST', '_FILES', '_REQUEST', '_SESSION', '_ENV', 'GLOBALS', 'HTTP_RAW_POST_DATA',
'system_folder', 'application_folder', 'BM', 'EXT', 'CFG', 'URI', 'RTR', 'OUT', 'IN');
// Unset globals for security.
// This is effectively the same as register_globals = off
foreach (array($_GET, $_POST, $_COOKIE, $_SERVER, $_FILES, $_ENV, (isset($_SESSION) && is_array($_SESSION)) ? $_SESSION : array()) as $global)
{
if ( ! is_array($global))
{
if ( ! in_array($global, $protected))
{
unset($GLOBALS[$global]);
}
}
else
{
foreach ($global as $key => $val)
{
if ( ! in_array($key, $protected))
{
unset($GLOBALS[$key]);
}
if (is_array($val))
{
foreach($val as $k => $v)
{
if ( ! in_array($k, $protected))
{
unset($GLOBALS[$k]);
}
}
}
}
}
}
// Is $_GET data allowed? If not we'll set the $_GET to an empty array
if ($this->allow_get_array == FALSE)
{
/**
* ここをFALSEの場合でも、$_GETの値を取得できるようにすれば良さそう
*/
//$_GET = array();
echo 'これは、継承したクラスです';
$_GET = $this->_clean_input_data($_GET);
}
else
{
$_GET = $this->_clean_input_data($_GET);
}
// Clean $_POST Data
$_POST = $this->_clean_input_data($_POST);
// Clean $_COOKIE Data
// Also get rid of specially treated cookies that might be set by a server
// or silly application, that are of no use to a CI application anyway
// but that when present will trip our 'Disallowed Key Characters' alarm
// http://www.ietf.org/rfc/rfc2109.txt
// note that the key names below are single quoted strings, and are not PHP variables
unset($_COOKIE['$Version']);
unset($_COOKIE['$Path']);
unset($_COOKIE['$Domain']);
$_COOKIE = $this->_clean_input_data($_COOKIE);
log_message('debug', "Global POST and COOKIE data sanitized");
}
}
/* End of file welcome.php */
デバッグ入れてます。
条件分岐、いらねぇじゃんというツッコミは無しで。
これで、GETとPOSTの両方を使えるようにはなりました。
こんなんで、どうですかね?
もし使ってみて、変な箇所あれば、コメント頂けると幸いです。
ご参考までに。