Input 類別
Input 類別有兩個目的:
- 基於安全, 它預處理全域輸入資料。
- 它提提供幾個補助函數用來取得輸入資料並預處理。
注意:系統會自動初始這個類別, 所以不需要手動載入。
安全過濾 (Security Filtering)
安全過濾函數在執行一個新的controller 時會自動呼叫。它會執行:
- If $config['allow_get_array'] is FALSE(default is TRUE), destroys the global GET array.
- 在 register_globals 打開時, 破壞所有全域變數。 +
- Filters the GET/POST/COOKIE array keys, permitting only alpha-numeric (and a few other) characters.
- 提供 XSS (Cross-site Scripting Hacks) 過濾。這可以是全域啟動或根據請求啟動 (request)。 +
- Standardizes newline characters to \n(In Windows \r\n)
跨網站 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()
- $this->input->cookie()
- $this->input->server()
$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()