CodeIgniter 使用手冊版本 2.1.4


Input 類別

Input 類別有兩個目的:

  1. 基於安全, 它預處理全域輸入資料。
  2. 它提提供幾個補助函數用來取得輸入資料並預處理。

注意:系統會自動初始這個類別, 所以不需要手動載入。

安全過濾 (Security Filtering)

安全過濾函數在執行一個新的controller 時會自動呼叫。它會執行:

跨網站 XSS 過濾

Input 類別可以自動過濾輸入值以避免 XSS 的攻擊,如果你想要在每次遇到 POST 或 COOKIE 的資料時就自動啟動,你可以到 application/config/config.php 設定:

$config['global_xss_filtering'] = TRUE;

請參照 Security class 的文件

注意:CI 2.0.0 將 $this->input->xss_clean() 轉換到 $this->security->xss_clean() 詳細請看 Security 類別

使用 POST, COOKIE, 或 SERVER 資料

CodeIgniter 提供三個讓你取出 POST, COOKIE 或 SERVER 中項目的補助函數。使用這些函數的主要便利性在於, 它們會確認並檢視是否這些項目已被設定並且在未設定時回傳 false (boolean) , 而不是直接取出 ($_POST['something'])。這讓你可以方便地使用資料而不必預先測試它們是否存在。不然, 通常你可能會像這樣做:

if ( ! isset($_POST['something']))
{
    $something = FALSE;
}
else
{
    $something = $_POST['something'];
}

有了 CodeIgniter 的內建函數, 你可以簡單地這樣做:

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

這三個函數是:

$this->input->post()

第一個參數包含你要找的 POST 項目名稱:

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

這個函數在你要取得的項目不存在時會回傳 FALSE (boolean)。

額外的第二個參數讓你用 XSS 過濾器處理資料。把第二個參數設定為 TRUE (boolean) 就可以啟動:

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

如果不帶入任何參數,則回傳單一陣列,該陣列包含 POST 所有資料

如果想利用 XSS 過濾全部 POST 陣列值,請將第一個參數帶入 NULL,第二個參數帶入布林函數 TRUE

在 GET 陣列沒有找到任何資料,則回傳 FALSE

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

$this->input->get()

這個函數與 post 函數相同, 只是他會取得 get 的資料:

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

如果不帶入任何參數,則回傳單一陣列,該陣列包含 GET 所有資料

如果想利用 XSS 過濾全部 GET 陣列值,請將第一個參數帶入 NULL,第二個參數帶入布林函數 TRUE

在 GET 陣列沒有找到任何資料,則回傳 FALSE

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

$this->input->get_post()

這個函數會搜尋 post 及 get 串流來取得資料, 會先尋找 post 而後尋找 get :

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

$this->input->cookie()

這個函數與 post 函數相同, 只是他會取得 cookie 的資料:

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

$this->input->server()

這個函數與以上的函數相同, 只是他會取得 server 的資料:

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

$this->input->set_cookie()

以下有二個方法可以將你指定的值設定到 cookie 中:

陣列

使用關聯式陣列:

$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);

注意:

只有名稱和值是必要的,如果要刪除 cookie 則將它設定過期即可

過期的設定是以 為單位,如果過期時間設為 0 則代表 cookie 只有在瀏覽器開啟的期間有效

對於整個網站的 cookie,請加入 URL 到 'domain' 中,例如: .your-domain.com

如果這個函數是設定在根目錄中,那則不需要設定 'path'

如果你想避免名稱碰撞的問題,請加入前綴詞在 'prefix'

如果你想使它成為 secure cookie,請將 'secure' 設定為 TRUE

個別參數

如果你願意,你可以透過個別參數的方式來設定 cookie:

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

$this->input->cookie()

讓你取得 cookie,第一個參數為你想要找的 cookie 名稱(包含前綴詞):

cookie('some_cookie');

如果找不到,則會回傳 FALSE

第二個參數設定為 TRUE 可以讓你使用 xss 過濾

cookie('some_cookie', TRUE);

$this->input->ip_address()

取得當前使用者的 IP 位址。如果 IP 位址不合法, 那函數會回傳 0.0.0.0。

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

$this->input->valid_ip($ip)

傳入一個 IP 位址並依照它是否合法來返回 TRUE 或 FALSE (boolean) 。 注意: 上面的 $this->input->ip_address() 函數會自動驗證 IP 是否合法。

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

$this->input->user_agent()

返回當前使用者所使用的網頁瀏覽器, 如果沒有有效資訊則回傳 FALSE 。

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

詳情請見 User Agent Class

$this->input->request_headers()

在非 APACHE 的環境中, apache_request_headers() 是無效的,因此本函式適用在非 APACHE 的環境中,回傳 header 的陣列

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

$this->input->get_request_header();

回傳 header 的陣列所指定的項目

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

$this->input->is_ajax_request()

檢查 HTTP_X_REQUESTED_WITH 是否設定,並且回傳布林值

$this->input->is_cli_request()

檢查 STDIN 常數是否設定,它是一個安全容錯 (failsafe) 的方法來檢查 PHP 是否在命令列中執行

$this->input->is_cli_request()