CodeIgniter 輸入類

2018-07-21 15:39 更新

輸入類

輸入類有兩個(gè)用途:

  1. 為了安全性,對(duì)輸入數(shù)據(jù)進(jìn)行預(yù)處理
  2. 提供了一些輔助方法來獲取輸入數(shù)據(jù)并處理

注解

該類由系統(tǒng)自動(dòng)加載,你無需手工加載

對(duì)輸入進(jìn)行過濾

安全性過濾

當(dāng)訪問 控制器 時(shí),安全過濾方法會(huì)自動(dòng)被調(diào)用, 它做了以下幾件事情:

  • 如果 $config['allow_get_array'] 設(shè)置為 FALSE (默認(rèn)是 TRUE),銷毀全局的 GET 數(shù)組。
  • 當(dāng)開啟 register_globals 時(shí),銷毀所有的全局變量。
  • 過濾 GET/POST/COOKIE 數(shù)據(jù)的鍵值,只允許出現(xiàn)字母和數(shù)字(和其他一些)字符。
  • 提供了 XSS (跨站腳本攻擊)過濾,可全局啟用,或按需啟用。
  • 將換行符統(tǒng)一為 PHP_EOL (基于 UNIX 的系統(tǒng)下為 \n,Windows 系統(tǒng)下為 \r\n),這個(gè)是可配置的。

XSS 過濾

輸入類可以自動(dòng)的對(duì)輸入數(shù)據(jù)進(jìn)行過濾,來阻止跨站腳本攻擊。如果你希望在每次遇到 POST 或 COOKIE 數(shù)據(jù)時(shí)自動(dòng)運(yùn)行過濾,你可以在application/config/config.php 配置文件中設(shè)置如下參數(shù):

$config['global_xss_filtering'] = TRUE;

關(guān)于 XSS 過濾的信息,請(qǐng)參考 安全類 文檔。

重要

參數(shù) 'global_xss_filtering' 已經(jīng)廢棄,保留它只是為了實(shí)現(xiàn)向前兼容。 XSS 過濾應(yīng)該在輸出的時(shí)候進(jìn)行,而不是輸入的時(shí)候!

訪問表單數(shù)據(jù)

使用 POST、GET、COOKIE 和 SERVER 數(shù)據(jù)

CodeIgniter 提供了幾個(gè)輔助方法來從 POST、GET、COOKIE 和 SERVER 數(shù)組中獲取數(shù)據(jù)。 使用這些方法來獲取數(shù)據(jù)而不是直接訪問數(shù)組($_POST['something'])的最大的好處是, 這些方法會(huì)檢查獲取的數(shù)據(jù)是否存在,如果不存在則返回 NULL 。這使用起來將很方便, 你不再需要去檢查數(shù)據(jù)是否存在。換句話說,通常你需要像下面這樣做:

$something = isset($_POST['something']) ? $_POST['something'] : NULL;

使用 CodeIgniter 的方法,你可以簡(jiǎn)單的寫成:

$something = $this->input->post('something');

主要有下面幾個(gè)方法:

  • $this->input->post()
  • $this->input->get()
  • $this->input->cookie()
  • $this->input->server()

使用 php://input 流

如果你需要使用 PUT、DELETE、PATCH 或其他的請(qǐng)求方法,你只能通過一個(gè)特殊的輸入流來訪問, 這個(gè)流只能被讀一次,這和從諸如 $_POST 數(shù)組中讀取數(shù)據(jù)相比起來要復(fù)雜一點(diǎn),因?yàn)?POST 數(shù)組可以被訪問多次來獲取多個(gè)變量,而不用擔(dān)心它會(huì)消失。

CodeIgniter 為你解決了這個(gè)問題,你只需要使用下面的 $raw_input_stream 屬性即可, 就可以在任何時(shí)候讀取 php://input 流中的數(shù)據(jù):

$this->input->raw_input_stream;

另外,如果輸入流的格式和 $_POST 數(shù)組一樣,你也可以通過 input_stream() 方法來訪問它的值:

$this->input->input_stream('key');

和其他的 get() 和 post() 方法類似,如果請(qǐng)求的數(shù)據(jù)不存在,則返回 NULL 。 你也可以將第二個(gè)參數(shù)設(shè)置為 TRUE ,來讓數(shù)據(jù)經(jīng)過 xss_clean()的檢查:

$this->input->input_stream('key', TRUE); // XSS Clean
$this->input->input_stream('key', FALSE); // No XSS filter

注解

你可以使用 method() 方法來獲取你讀取的是什么數(shù)據(jù),PUT、DELETE 還是 PATCH 。

類參考

classCI_Input

$raw_input_stream

返回只讀的 php://input 流數(shù)據(jù)。

該屬性可以被多次讀取。

post([$index = NULL[, $xss_clean = NULL]])

| 參數(shù): |

  • $index (mixed) -- POST parameter name
  • $xss_clean (bool) -- Whether to apply XSS filtering

    |
    | 返回: |

$_POST if no parameters supplied, otherwise the POST value if found or NULL if not

|
| 返回類型: |

mixed

|

第一個(gè)參數(shù)為你想要獲取的 POST 數(shù)據(jù)名:

$this->input->post('some_data');

如果獲取的數(shù)據(jù)不存在,該方法返回 NULL 。

第二個(gè)參數(shù)可選,用于決定是否使用 XSS 過濾器對(duì)數(shù)據(jù)進(jìn)行過濾。 要使用過濾器,可以將第二個(gè)參數(shù)設(shè)置為 TRUE ,或者將$config['global_xss_filtering'] 參數(shù)設(shè)置為 TRUE 。

$this->input->post('some_data', TRUE);

如果不帶任何參數(shù)該方法將返回 POST 中的所有元素。

如果希望返回 POST 所有元素并將它們通過 XSS 過濾器進(jìn)行過濾, 可以將第一個(gè)參數(shù)設(shè)為 NULL ,第二個(gè)參數(shù)設(shè)為 TRUE

$this->input->post(NULL, TRUE); // returns all POST items with XSS filter
$this->input->post(NULL, FALSE); // returns all POST items without XSS filter

如果要返回 POST 中的多個(gè)元素,將所有需要的鍵值作為數(shù)組傳給它:

$this->input->post(array('field1', 'field2'));

和上面一樣,如果希望數(shù)據(jù)通過 XSS 過濾器進(jìn)行過濾,將第二個(gè)參數(shù)設(shè)置為 TRUE:

$this->input->post(array('field1', 'field2'), TRUE);

get([$index = NULL[, $xss_clean = NULL]])

參數(shù):

  • $index (mixed) -- GET parameter name
  • $xss_clean (bool) -- Whether to apply XSS filtering

返回: $_GET if no parameters supplied, otherwise the GET value if found or NULL if not

返回類型: mixed

該函數(shù)和 post() 一樣,只是它用于獲取 GET 數(shù)據(jù)。

$this->input->get('some_data', TRUE);

如果不帶任何參數(shù)該方法將返回 GET 中的所有元素。

如果希望返回 GET 所有元素并將它們通過 XSS 過濾器進(jìn)行過濾, 可以將第一個(gè)參數(shù)設(shè)為 NULL ,第二個(gè)參數(shù)設(shè)為 TRUE

$this->input->get(NULL, TRUE); // returns all GET items with XSS filter
$this->input->get(NULL, FALSE); // returns all GET items without XSS filtering

如果要返回 GET 中的多個(gè)元素,將所有需要的鍵值作為數(shù)組傳給它:

$this->input->get(array('field1', 'field2'));

和上面一樣,如果希望數(shù)據(jù)通過 XSS 過濾器進(jìn)行過濾,將第二個(gè)參數(shù)設(shè)置為 TRUE:

$this->input->get(array('field1', 'field2'), TRUE);

post_get($index[, $xss_clean = NULL])

參數(shù):

  • $index (string) -- POST/GET parameter name
  • $xss_clean (bool) -- Whether to apply XSS filtering

返回: POST/GET value if found, NULL if not

返回類型: mixed

該方法和 post() 和 get() 方法類似,它會(huì)同時(shí)查找 POST 和 GET 兩個(gè)數(shù)組來獲取數(shù)據(jù), 先查找 POST ,再查找 GET:

$this->input->post_get('some_data', TRUE);

get_post($index[, $xss_clean = NULL])

參數(shù):

  • $index (string) -- GET/POST parameter name
  • $xss_clean (bool) -- Whether to apply XSS filtering

返回: GET/POST value if found, NULL if not

返回類型: mixed

該方法和 post_get() 方法一樣,只是它先查找 GET 數(shù)據(jù):

$this->input->get_post('some_data', TRUE);

注解

這個(gè)方法在之前的版本中和 post_get() 方法是完全一樣的,在 CodeIgniter 3.0 中有所修改。

cookie([$index = NULL[, $xss_clean = NULL]])

參數(shù):

  • $index (mixed) -- COOKIE name
  • $xss_clean (bool) -- Whether to apply XSS filtering

返回:

$_COOKIE if no parameters supplied, otherwise the COOKIE value if found or NULL if not

返回類型: mixed

該方法和 post() 和 get() 方法一樣,只是它用于獲取 COOKIE 數(shù)據(jù):

$this->input->cookie('some_cookie');
$this->input->cookie('some_cookie, TRUE); // with XSS filter

如果要返回 COOKIE 中的多個(gè)元素,將所有需要的鍵值作為數(shù)組傳給它:

$this->input->cookie(array('some_cookie', 'some_cookie2'));

注解

和 Cookie 輔助函數(shù) 中的 get_cookie() 函數(shù)不同的是,這個(gè)方法不會(huì)根據(jù) $config['cookie_prefix'] 來添加前綴。

server($index[, $xss_clean = NULL])

參數(shù):

  • $index (mixed) -- Value name
  • $xss_clean (bool) -- Whether to apply XSS filtering

返回: $_SERVER item value if found, NULL if not

返回類型: mixed

該方法和 post() 、 get() 和 cookie() 方法一樣,只是它用于獲取 SERVER 數(shù)據(jù):

$this->input->server('some_data');

如果要返回 SERVER 中的多個(gè)元素,將所有需要的鍵值作為數(shù)組傳給它:

$this->input->server(array('SERVER_PROTOCOL', 'REQUEST_URI'));

input_stream([$index = NULL[, $xss_clean = NULL]])

參數(shù):

  • $index (mixed) -- Key name
  • $xss_clean (bool) -- Whether to apply XSS filtering

返回: Input stream array if no parameters supplied, otherwise the specified value if found or NULL if not

返回類型: mixed

該方法和 get() 、 post() 和 cookie() 方法一樣,只是它用于獲取 php://input 流數(shù)據(jù)。

set_cookie($name = ''[, $value = ''[, $expire = ''[, $domain = ''[, $path = '/'[, $prefix = ''[, $secure = FALSE[, $httponly = FALSE]]]]]]])

參數(shù):

  • $name (mixed) -- Cookie name or an array of parameters
  • $value (string) -- Cookie value
  • $expire (int) -- Cookie expiration time in seconds
  • $domain (string) -- Cookie domain
  • $path (string) -- Cookie path
  • $prefix (string) -- Cookie name prefix
  • $secure (bool) -- Whether to only transfer the cookie through HTTPS
  • $httponly (bool) -- Whether to only make the cookie accessible for HTTP requests (no JavaScript)

返回類型: void

設(shè)置 COOKIE 的值,有兩種方法來設(shè)置 COOKIE 值:數(shù)組方式和參數(shù)方式。

數(shù)組方式

使用這種方式,可以將第一個(gè)參數(shù)設(shè)置為一個(gè)關(guān)聯(lián)數(shù)組:

$cookie = array(
    'name'   => 'The Cookie Name',
    'value'  => 'The Value',
    'expire' => '86500',
    'domain' => '.some-domain.com',
    'path'   => '/',
    'prefix' => 'myprefix_',
    'secure' => TRUE
);

$this->input->set_cookie($cookie);

注意

只有 name 和 value 兩項(xiàng)是必須的,要?jiǎng)h除 COOKIE 的話,將 expire 設(shè)置為空。

COOKIE 的過期時(shí)間是  ,將它加到當(dāng)前時(shí)間上就是 COOKIE 的過期時(shí)間。 記住不要把它設(shè)置成時(shí)間了,只要設(shè)置成距離當(dāng)前時(shí)間的秒數(shù)即可,那么在這段 時(shí)間內(nèi),COOKIE 都將保持有效。如果將過期時(shí)間設(shè)置為 0 ,那么 COOKIE 只在 瀏覽器打開的期間是有效的,關(guān)閉后就失效了。

如果需要設(shè)置一個(gè)全站范圍內(nèi)的 COOKIE ,而不關(guān)心用戶是如何訪問你的站點(diǎn)的, 可以將 domain 參數(shù)設(shè)置為你的 URL 前面以句點(diǎn)開頭,如:.your-domain.com

path 參數(shù)通常不用設(shè),上面的例子設(shè)置為根路徑。

prefix 只在你想避免和其他相同名稱的 COOKIE 沖突時(shí)才需要使用。

secure 參數(shù)只有當(dāng)你需要使用安全的 COOKIE 時(shí)使用。

參數(shù)方式

如果你喜歡,你也可以使用下面的方式來設(shè)置 COOKIE:

$this->input->set_cookie($name, $value, $expire, $domain, $path, $prefix, $secure);

ip_address()

返回: Visitor's IP address or '0.0.0.0' if not valid
返回類型: string

返回當(dāng)前用戶的 IP 地址,如果 IP 地址無效,則返回 '0.0.0.0':

echo $this->input->ip_address();

重要

該方法會(huì)根據(jù) $config['proxy_ips'] 配置,來返回 HTTP_X_FORWARDED_FOR、 HTTP_CLIENT_IP、HTTP_X_CLIENT_IP 或 HTTP_X_CLUSTER_CLIENT_IP 。

valid_ip($ip[, $which = ''])

參數(shù):

  • $ip (string) -- IP address
  • $which (string) -- IP protocol ('ipv4' or 'ipv6')

返回: TRUE if the address is valid, FALSE if not

返回類型: bool

判斷一個(gè) IP 地址是否有效,返回 TRUE/FALSE 。

注解

上面的 $this->input->ip_address() 方法會(huì)自動(dòng)驗(yàn)證 IP 地址的有效性。

if ( ! $this->input->valid_ip($ip))
{
    echo 'Not Valid';
}
else
{
    echo 'Valid';
}

第二個(gè)參數(shù)可選,可以是字符串 'ipv4' 或 'ipv6' 用于指定 IP 的格式,默認(rèn)兩種格式都會(huì)檢查。

user_agent([$xss_clean = NULL])

返回: User agent string or NULL if not set

參數(shù):

  • $xss_clean (bool) -- Whether to apply XSS filtering

返回類型: mixed

返回當(dāng)前用戶的用戶代理字符串(Web 瀏覽器),如果不可用則返回 FALSE 。

echo $this->input->user_agent();

關(guān)于用戶代理的相關(guān)方法請(qǐng)參考 用戶代理類 。

request_headers([$xss_clean = FALSE])

參數(shù):

  • $xss_clean (bool) -- Whether to apply XSS filtering

返回: An array of HTTP request headers

返回類型: array

返回 HTTP 請(qǐng)求頭數(shù)組。當(dāng)在非 Apache 環(huán)境下運(yùn)行時(shí), apache_request_headers() 函數(shù)不可用, 這個(gè)方法將很有用。

$headers = $this->input->request_headers();

get_request_header($index[, $xss_clean = FALSE])

參數(shù):

  • $index (string) -- HTTP request header name
  • $xss_clean (bool) -- Whether to apply XSS filtering

返回: An HTTP request header or NULL if not found

返回類型: string

返回某個(gè)指定的 HTTP 請(qǐng)求頭,如果不存在,則返回 NULL 。

$this->input->get_request_header('some-header', TRUE);

is_ajax_request()

返回: TRUE if it is an Ajax request, FALSE if not
返回類型: bool

檢查服務(wù)器頭中是否含有 HTTP_X_REQUESTED_WITH ,如果有返回 TRUE ,否則返回 FALSE 。

is_cli_request()

返回: TRUE if it is a CLI request, FALSE if not
返回類型: bool

檢查程序是否從命令行界面運(yùn)行。

注解

該方法檢查當(dāng)前正在使用的 PHP SAPI 名稱,同時(shí)檢查是否定義了 STDIN 常量, 來判斷當(dāng)前 PHP 是否從命令行運(yùn)行。

$this->input->is_cli_request()

注解

該方法已經(jīng)被廢棄,現(xiàn)在只是 is_cli() 函數(shù)的一個(gè)別名而已。

method([$upper = FALSE])

參數(shù):

  • $upper (bool) -- Whether to return the request method name in upper or lower case

返回: HTTP request method

返回類型: string

返回 $_SERVER['REQUEST_METHOD'] 的值,它有一個(gè)參數(shù)用于設(shè)置返回大寫還是小寫。

echo $this->input->method(TRUE); // Outputs: POST
echo $this->input->method(FALSE); // Outputs: post
echo $this->input->method(); // Outputs: post
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)