ホームページ  >  記事  >  バックエンド開発  >  CI フレームワークのソース コードの読み取り----------Input.php_PHP チュートリアル

CI フレームワークのソース コードの読み取り----------Input.php_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:09:20934ブラウズ

[php]

/** 
* コードイグナイター
*
* PHP 5.1.6 以降用のオープンソース アプリケーション開発フレームワーク
*
* @package CodeIgniter
* @author ExpressionEngine 開発チーム
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
* @license http://codeigniter.com/user_guide/license.html
* @link http://codeigniter.com
* @since バージョン 1.0
* @filesource
 */
// ----------------------------------------------- --- --------------------------
/** 
* 入力クラス
*
* セキュリティのためにグローバル入力データを前処理します
*
* @package CodeIgniter
* @subpackage ライブラリ
* @category 入力
* @author ExpressionEngine 開発チーム
* @link http://codeigniter.com/user_guide/libraries/input.html
 */
クラス CI_Input {
/**
* 現在のユーザーの IP アドレス
* 現在のユーザーの IP アドレス
* @var 文字列
*/
var $ip_address = FALSE;
/**
* 現在のユーザーが使用しているユーザーエージェント (Web ブラウザー)
* 現在のユーザー (Web ブラウザー) プロキシ
* @var 文字列
*/
var $user_agent = FALSE;
/**
* FALSE の場合、$_GET は空の配列に設定されます
* FALSE の場合、$_GET は空の配列に設定されます
* @var bool
*/
var $_allow_get_array = TRUE
/**
* TRUEの場合、改行は標準化されます
* TRURの場合、新しい行は正規化されます
*
* @var bool
*/
var $_standardize_newlines = TRUE
/**
* GET、POST、または COOKIE データが発生したときに XSS フィルターを常にアクティブにするかどうかを決定します
* 構成設定に基づいて自動的に設定されます
* GET、POST、COOKIE データで常に XSS フィルタリングを実行するかどうかを決定します
* 設定オプションで自動的にオンにするかどうかを設定します
*
* @var bool
*/
var $_enable_xss = FALSE;
/** 
* CSRF Coo​​kie トークンの設定を有効にします。 
* 構成設定に基づいて自動的に設定されます
* 允许CSRF cookie令牌
*
* @var bool
     */
var $_enable_csrf = FALSE;
/**
* すべてのHTTPリクエストヘッダーのリスト
* HTTPリクエストヘッダーのリスト
* @var 配列
*/
protected $headers = array();
/**
* コンストラクター
* XSS処理をグローバルに許可するかどうか、および$_GET配列の使用を許可するかどうかを設定します
* XSS処理をグローバルに有効にするかどうかを設定します
* そして $_GET 配列を許可するかどうか
*
* @return void
*/
パブリック関数 __construct()
{
Log_message('debug', "入力クラスが初期化されました");
// $_GET XSS フィルタリングと csrf 保護をグローバルに許可するかどうかを構成ファイルから取得します
$this->_allow_get_array = (config_item('allow_get_array') === TRUE);
$this->_enable_xss = (config_item('global_xss_filtering') === TRUE);
$this->_enable_csrf = (config_item('csrf_protection') === TRUE);
// globals_register をオンにすると、この設定をオフにすることと同じになります。
// セキュリティ保護をオンにする
グローバル $SEC
$this->security =& $SEC;
// UTF-8 クラスは必要ですか?
if (UTF8_ENABLED === TRUE)
グローバル $UNI
$this->uni =& $UNI;
}
// グローバル配列をサニタイズします
$this->_sanitize_globals();
}
// ----------------------------------------------- --- --------------------------
/**
* 配列から取得します
* $array から値を取得し、xss_clean が設定されている場合はフィルターします
* これはグローバル配列から値を取得するためのヘルパー関数です
* これはグローバル配列から取得するために使用されるヘルパー関数です
*
*@アクセス非公開
* @param配列
* @パラメータ文字列
* @param bool
* @戻り文字列
*/
関数 _fetch_from_array(&$array, $index = '', $xss_clean = FALSE)
{
if ( ! isset($array[$index]))
FALSE を返します。
}
if ($xss_clean === TRUE)
$this->security->xss_clean($array[ $インデックス]);
}
️ -- $ を返す配列[$index]
}
// ----------------------------------------------- --- --------------------------
/**
* GET 配列から項目を取得します
* フィルタリングされた GET 配列を取得します
* @アクセス公開
* @パラメータ文字列
* @param bool
* @戻り文字列
*/
関数 get($index = NULL, $xss_clean = FALSE)
{
// フィールドが提供されているかどうかを確認します
// フィールドが提供されているかどうかを確認します
if ($index === NULL AND ! emptyempty($_GET))
$get = array();
// _GET 配列全体をループします
// 遍历_GET数组
foreach (array_keys($_GET) as $key)
{
$get[$key] = $this->_fetch_from_array($_GET, $key, $xss_clean);  
}
$get; を返す  
}
return $this->_fetch_from_array($_GET, $index, $xss_clean);  
}
// ----------------------------------------------- ---------------------
/**
* POST 配列から項目を取得します
* フィルターされた $_POST 値を取得します
* @アクセス公開
* @パラメータ文字列
* @param bool
* @戻り文字列
*/
関数 post($index = NULL, $xss_clean = FALSE)
{
// フィールドが提供されているかどうかを確認します
if ($index === NULL AND ! emptyempty($_POST))
{
$post = array();  
// _POST 配列全体をループして返します
foreach (array_keys($_POST) as $key)
{
$post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean);  
}
$post を返します。  
}
return $this->_fetch_from_array($_POST, $index, $xss_clean);  
}
// ----------------------------------------------- ---------------------
/** 
* GET 配列または POST から項目をフェッチします
* 从get和post中获取值、post优先
* @access public
* @param string インデックスキー
* @param bool XSS クリーニング
* @return 文字列
   */
function get_post($index = '', $xss_clean = FALSE)
{
if ( ! isset($_POST[$index]) )
{
return $this->get($index, $xss_clean);  
}
その他
{
return $this->post($index, $xss_clean);  
}
}
// ----------------------------------------------- ---------------------
/**
* COOKIE 配列から項目を取得します
* フィルタリングされた COOKIE 値を返します
* @アクセス公開
* @パラメータ文字列
* @param bool
* @戻り文字列
*/
関数 cookie($index = '', $xss_clean = FALSE)
{
return $this->_fetch_from_array($_COOKIE, $index, $xss_clean);  
}
// ----------------------------------------------- ------------------------
/**
* クッキーを設定します
*
* 6 つのパラメータを受け入れるか、関連付けを送信できます
* すべての値を含む最初のパラメータの配列。
* 6つのパラメータを受け取るか、すべての値を含む連想配列を受け取ります
* @アクセス公開
* @param混合
* @param string クッキーの値
* @param 文字列は有効期限が切れるまでの秒数
* @param 文字列 Cookie ドメイン: 通常: .yourdomain.com
* @param クッキーのパスを文字列化します
* @param string Cookie プレフィックス
* @param bool true は Cookie を安全にします
* @return void
*/
関数 set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = FALSE)
{
️ // 最初の値が配列の場合、配列内の値を残りのパラメーターに割り当てます
if (is_array($name))
// $$アイテムのためにループが壊れるので、常に「名前」を最後の場所に残してください。
foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'name') as $item)
$$item = $name[$item];
}
}
}
// パラメータがデフォルト値であるが、config.php の設定がデフォルト値ではない場合
F // config.php の設定値を使用します
if ($prefix == '' AND config_item('cookie_prefix') != '')
$prefix = config_item('cookie_prefix');
}
if ($domain == '' AND config_item('cookie_domain') != '')
$domain = config_item('cookie_domain');
}
if ($path == '/' AND config_item('cookie_path') != '/')
$path = config_item('cookie_path');
}
if ($secure == FALSE AND config_item('cookie_secure') != FALSE)
$secure = config_item('cookie_secure');
}
if ( ! is_numeric($expire))
$expire = time() - 86500;
}
その他
$expire = ($expire > 0) time() + $expire : 0;
}
setcookie($prefix.$name, $value, $expire, $path, $domain, $secure);
}
// ----------------------------------------------- --- --------------------------
/**
* SERVER 配列から項目を取得します
* フィルタリングされた $_SERVER 値を返します
* @アクセス公開
* @パラメータ文字列
* @param bool
* @戻り文字列
*/
関数サーバー($index = '', $xss_clean = FALSE)
{
return $this->_fetch_from_array($_SERVER, $index, $xss_clean);  
}
// ----------------------------------------------- ---------------------
/**
* IP アドレスを取得します
* 現在のユーザーの IP を返します。 IP アドレスが無効な場合は、IP 0.0.0.0 を返します:
* @戻り文字列
*/
パブリック関数 ip_address()
{
// 如果已经有了ip_address 则返
if ($this->ip_address !== FALSE)
{
$this->ip_address; を返す  
}
$proxy_ips = config_item('proxy_ips');  
if ( ! emptyempty($proxy_ips))
{
$proxy_ips =explode(',', str_replace(' ', '', $proxy_ips));  
foreach (array('HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'HTTP_X_CLIENT_IP', 'HTTP_X_CLUSTER_CLIENT_IP') as $header)
{
if (($spoof = $this->server($header)) !== FALSE)
{
// 一部のプロキシは通常、IP チェーン全体をリストします
// クライアントが当社に連絡した際に経由したアドレス。  
// 例: client_ip、proxy_ip1、proxy_ip2 など
if (strpos($spoof, ',') !== FALSE)
{
$spoof =explode(',', $spoof, 2);  
$spoof = $spoof[0];  
}
if ( ! $this->valid_ip($spoof))
{
$spoof = FALSE;  
}
その他
{
休憩。  
}
}
}
$this->ip_address = ($spoof !​​== FALSE && in_array($_SERVER['REMOTE_ADDR'], $proxy_ips, TRUE))
? $spoof : $_SERVER['REMOTE_ADDR'];  
}
その他
{
$this->ip_address = $_SERVER['REMOTE_ADDR'];  
}
if ( ! $this->valid_ip($this->ip_address))
{
$this->ip_address = '0.0.0.0';  
}
$this->ip_address; を返す  
}
// ----------------------------------------------- ---------------------
/**
* IP アドレスを検証します
* 入力された IP アドレスが有効かどうかをテストし、ブール値 TRUE または FALSE を返します。
* 注: $this->input->ip_address() は、入力された IP アドレス自体の形式が有効かどうかを自動的にテストします。
* @アクセス公開
* @パラメータ文字列
* @param 文字列 ipv4 または ipv6
* @return bool
*/
パブリック関数 valid_ip($ip, $that = '')
{
$that = strto lower($that);  
// まず、filter_var が利用可能かどうかを確認します
if (is_callable('filter_var'))
{
switch ($that) {
case 'ipv4':
$flag = FILTER_FLAG_IPV4;  
休憩。  
case 'ipv6':
$flag = FILTER_FLAG_IPV6;  
休憩。  
デフォルト:
$flag = '';  
休憩。  
}
return (bool) filter_var($ip, FILTER_VALIDATE_IP, $flag);  
}
if ($どれ !== 'ipv6' && $どれ !== 'ipv4')
{
if (strpos($ip, ':') !== FALSE)
{
$that = 'ipv6';  
}
elseif (strpos($ip, '.') !== FALSE)
{
$that = 'ipv4';  
}
その他
{
FALSE を返します。  
}
}
$func = '_valid_'.$that;  
return $this->$func($ip);  
}
// ----------------------------------------------- ---------------------
/**
* IPv4 アドレスを検証します
* 验证ipv4地址
* Geert De Deckere によって提案された更新バージョン
*
* @access protected
* @param 文字列
* @return bool
*/
保護された関数 _valid_ipv4($ip)
{
$ip_segments =explode('.', $ip);  
// 常に 4 つのセグメントが必要
if (count($ip_segments) !== 4)
{
FALSE を返します。  
}
// IP を 0 で始めることはできません
if ($ip_segments[0][0] == '0')
{
FALSE を返します。  
}
// 各セグメントを確認します
foreach ($ip_segments を $segment として)
{
// IP セグメントは数字である必要があり、
// 3 桁より長い、または 255 より大きい
if ($segment == '' OR preg_match("/[^0-9]/", $segment) OR $segment > 255 OR strlen($segment) > 3)
{
FALSE を返します。  
}
}
TRUE を返します。  
}
// ----------------------------------------------- ---------------------
/**
* IPv6 アドレスを検証する
* IPv6 アドレスを確認します
* @access 保護されています
* @パラメータ文字列
* @return bool
*/
保護された関数 _valid_ipv6($str)
{
// 8 つのグループ、次のように区切られます:
// グループごとに 0 ~ ffff
// 連続する 0 グループの 1 セットは ::
に折りたたむことができます
$groups = 8;  
$collapsed = FALSE;  
$chunks = array_filter(
preg_split('/(:{1,2})/', $str, NULL, PREG_SPLIT_DELIM_CAPTURE)
);  
// 簡単なナンセンスを除外する
if (current($chunks) == ':' OR end($chunks) == ':')
{
FALSE を返します。  
}
// PHP は IPv4 にマップされた IPv6 アドレスをサポートしているため、それらも期待されます
if (strpos(end($chunks), '.') !== FALSE)
{
$ipv4 = array_pop($chunks);  
if ( ! $this->_valid_ipv4($ipv4))
{
FALSE を返します。  
}
$groups--;  
}
while ($seg = array_pop($chunks))
{
if ($seg[0] == ':')
{
if (--$groups == 0)
{
FALSE を返します。   // グループが多すぎます
}
if (strlen($seg) > 2)
{
FALSE を返します。   // 長い区切り文字
}
if ($seg == '::')
{
if ($collapsed)
{
FALSE を返します。   // 複数の折りたたみ
}
$collapsed = TRUE;  
}
}
elseif (preg_match("/[^0-9a-f]/i", $seg) OR strlen($seg) > 4)
{
FALSE を返します。 // 無効なセグメント
}
}
$collapsed OR $groups == 1; を返します。  
}
// ----------------------------------------------- ---------------------
/**
* ユーザーエージェント
* ユーザーが現在使用しているブラウザのユーザーエージェント情報を返します。 データが取得できない場合はFALSEを返します。
* 一般に、user_agent が空の場合、モバイルアクセス、またはカールクローリング、またはスパイダークローリングとみなされます
* @アクセス公開
* @戻り文字列
*/
関数 user_agent()
{
if ($this->user_agent !== FALSE)
{
return $this->user_agent;  
}
$this->user_agent = ( ! isset($_SERVER['HTTP_USER_AGENT'])) ? FALSE : $_SERVER['HTTP_USER_AGENT'];  
return $this->user_agent;  
}
// ----------------------------------------------- ---------------------
/**
* グローバルをサニタイズする
* グローバル配列をクリーンアップします
* この関数は次のことを行います:
* この関数は次の操作を実行します:
* $_GET データの設定を解除します (クエリ文字列が有効になっていない場合)
* $_GET を破棄します (クエリ文字列が有効になっていない場合)
* register_globals が有効な場合は、すべてのグローバルの設定を解除します
* register_globals がオンになっている場合は、すべてのグローバル配列を破棄します
*
* 改行文字を n に標準化します
* 標準化された改行文字 n
*@アクセス非公開
* @return void
*/
関数 _sanitize_globals()
{
// これらのグローバルのいずれかを設定解除するのは「間違っています」。  
// 以下の全局数セットは、危険です。
$protected = array('_SERVER', '_GET', '_POST', '_FILES', '_REQUEST',
to ️ 'system_folder'、'application_folder'、 、「外部」、
'CFG'、'URI'、'RTR'、'OUT'、'IN');
// 上記以外のグローバル配列を安全に破棄するために、セキュリティのグローバルの設定を解除します。
// これは事実上 register_globals = off と同じです
// この効果は register_globals と同じです
// 以下の処理後、保護されていないグローバル変数はすべて削除されます
foreach (array($_GET, $_POST, $_COOKIE) as $global)
if ( ! is_array($global))
if ( ! in_array($global, $protected))
グローバル $$グローバル
$$global = NULL;
}
}
その他
foreach ($global as $key => $val)
グローバル $$key
$$key = NULL; ️
}
}
}
// $_GET データは許可されますか? 許可されない場合は、$_GET を空の配列に設定します
// $_GET データは許可されますか? 許可されない場合は、$_GET を空の配列に設定します
if ($this->_allow_get_array == FALSE)
$_GET = array();
}
その他
if (is_array($_GET) AND count($_GET) > 0)
foreach ($_GET as $key => $val)
$_GET[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
}
}
}
// $_POST データをクリーンアップします
// $_POST 配列をフィルタリングします
if (is_array($_POST) AND count($_POST) > 0)
foreach ($_POST as $key => $val)
$_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
}
}
// $_COOKIE データをクリーンアップ
// 过滤$_COOKIE数组
if (is_array($_COOKIE) AND count($_COOKIE) > 0)
{
// サーバーによって設定される可能性のある特別に処理された Cookie も削除します
// または、いずれにしても CI アプリケーションには役に立たない愚かなアプリケーション
// ただし、これが存在すると、「禁止されているキー文字」アラームが作動します
// http://www.ietf.org/rfc/rfc2109.txt
// 以下のキー名は一重引用符で囲まれた文字列であり、PHP 変数ではないことに注意してください
unset($_COOKIE['$Version']);  
unset($_COOKIE['$Path']);  
unset($_COOKIE['$Domain']);  
foreach ($_COOKIE as $key => $val)
{
$_COOKIE[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);  
}
}
// PHP_SELF をサニタイズ
$_SERVER['PHP_SELF'] =trip_tags($_SERVER['PHP_SELF']);  
// HTTP リクエストの CSRF 保護チェック
// CSRF保护检测http请要求
if ($this->_enable_csrf == TRUE && ! $this->is_cli_request())
{
$this->security->csrf_verify();  
}
log_message('debug', "グローバル POST および COOKIE データはサニタイズされました");  
}
// ----------------------------------------------- ---------------------
/** 
* クリーンな入力データ
* 过滤入力データ
* これはヘルパー関数です。データをエスケープし、
* 改行文字を n に標準化します
*
* @access プライベート
* @param 文字列
* @return 文字列
   */
function _clean_input_data($str)
{
if (is_array($str))
{
$new_array = array();  
foreach ($str as $key => $val)
{
$new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);  
}
$new_array を返します。  
}
/* 一貫性を保つためにマジック引用符がオンになっている場合はスラッシュを削除します
バージョンが PHP5.4 未満で、get_magic_quotes_gpc が許可されている場合は、斜線を削除します。
注: PHP 5.4 では、get_magic_quotes_gpc() は常に 0 を返し、
将来のバージョンではおそらくまったく存在しなくなるでしょう。
注意: PHP5.4 以降のバージョン、get_magic_quotes_gpc() 将总是返0、
この機能は後続のバージョンで削除される可能性があります
if ( ! is_php('5.4') && get_magic_quotes_gpc())
$str = ストリップスラッシュ($str);
}
// サポートされている場合は UTF-8 をクリーンアップします utf8 のクリーンアップがサポートされている場合は
if (UTF8_ENABLED === TRUE)
$str = $this->uni->clean_string($str);
}
// 制御文字を削除します
$str = 非表示文字を削除($str);
// 入力データをフィルタリングする必要がありますか?
if ($this->_enable_xss === TRUE)
$str = $this->security->xss_clean($str);
}
// 必要に応じて改行を標準化します
if ($this->_standardize_newlines == TRUE)
if (strpos($str, "r") !== FALSE)
$str = str_replace(array("rn", "r", "rnn"), PHP_EOL, $str);
}
}
戻る
}
// ----------------------------------------------- --- --------------------------
/** 
* クリーンキー
* 过滤键值
* これはヘルパー関数です。悪意のあるユーザーを防ぐため
* キーを悪用しようとすることから、キーが
* 英数字テキストとその他のいくつかの項目のみで名前が付けられます。 
*
* @access プライベート
* @param 文字列
* @return 文字列
   */
関数 _clean_input_keys($str)
{
if ( ! preg_match("/^[a-z0-9:_/-]+$/i", $str))
exit('使用できないキー文字')
}
// サポートされている場合は UTF-8 をクリーンアップします
if (UTF8_ENABLED === TRUE)
$str = $this->uni->clean_string($str);
}
戻る
}
// ----------------------------------------------- --- --------------------------
/** 
* リクエストヘッダー
* 要求头(ヘッダー)の数を返します。
* Apache では、単純に apache_request_headers() を呼び出すことができますが、
* 他の Web サーバーを実行している人は、関数が未定義です。 
*
* @param bool XSS クリーニング
*
* @return 配列
     */
パブリック関数 request_headers($xss_clean = FALSE)
{
// Apache を見てみよう
if (function_exists('apache_request_headers'))
{
$headers = apache_request_headers();  
}
その他
{
$headers['Content-Type'] = (isset($_SERVER['CONTENT_TYPE'])) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE');  
foreach ($_SERVER as $key => $val)
{
if (strncmp($key, 'HTTP_', 5) === 0)
{
$headers[substr($key, 5)] = $this->_fetch_from_array($_SERVER, $key, $xss_clean);  
}
}
}
// SOME_HEADER を取得して Some-Header に変換します
foreach ($headers as $key => $val)
{
$key = str_replace('_', ' ', strto lower($key));  
$key = str_replace(' ', '-', ucwords($key));  
$this->headers[$key] = $val;  
}
$this->headers を返します。  
}
// ----------------------------------------------- ---------------------
/**
* リクエストヘッダーを取得する
* リクエストヘッダー配列内の要素の値を返します
* ヘッダー クラス メンバーの単一メンバーの値を返します
*
* $this->headers の @param 文字列配列キー
* @param boolean XSS クリーンかどうか
* @return 失敗した場合は混合 FALSE、成功した場合は文字列
*/
パブリック関数 get_request_header($index, $xss_clean = FALSE)
{
if (emptyempty($this->headers))
{
$this->request_headers();  
}
if ( ! isset($this->headers[$index]))
{
FALSE を返します。  
}
if ($xss_clean === TRUE)
{
return $this->security->xss_clean($this->headers[$index]);  
}
return $this->headers[$index];  
}
// ----------------------------------------------- ---------------------
/** 
* ajaxリクエストですか?  
* ajax请要求であるかどうか判断します
* リクエストに HTTP_X_REQUESTED_WITH ヘッダーが含まれているかどうかをテストします
*
* @return boolean
     */
パブリック関数 is_ajax_request()
{
return ($this->server('HTTP_X_REQUESTED_WITH') === 'XMLHttpRequest');  
}
// ----------------------------------------------- ---------------------
/**
* クリリクエストですか?
* リクエストが cli からのものであるかどうかを判断します
* リクエストがコマンドラインから行われたかどうかを確認するテスト
*
* @return bool
*/
パブリック関数 is_cli_request()
{
return (php_sapi_name() === 'cli' OR generated('STDIN'));  
}
}
/* ファイルの終わり Input.php */
/* 場所: ./system/core/Input.php */

http://www.bkjia.com/PHPjc/477658.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/477658.html技術記事 [php] ?php if ( !定義(BASEPATH)) exit(スクリプトへの直接アクセスは許可されません); /** * CodeIgniter * * PHP 5.1.6 以降用のオープンソース アプリケーション開発フレームワーク * * @packag...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。