CodeIgniter 安全類

2018-07-21 15:40 更新

安全類

安全類包含了一些方法,用于安全的處理輸入數(shù)據(jù),幫助你創(chuàng)建一個安全的應(yīng)用。

XSS 過濾

CodeIgniter 自帶了一個 XSS 過濾器來防御攻擊,它可以設(shè)置為自動運行過濾 所有遇到的 POST 和 COOKIE 數(shù)據(jù),也可以針對某一條數(shù)據(jù)進行過濾。默認情況下 它不是全局運行的,因為它會有相當(dāng)?shù)拈_銷,況且你并不是在所有地方都需要它。

XSS 過濾器會查找那些常被用來觸發(fā) JavaScript 腳本或者其他類型的企圖劫持 Cookie 或者其它惡意行為的代碼。如果發(fā)現(xiàn)任何不允許的內(nèi)容,它將把那些內(nèi)容 轉(zhuǎn)換為字符實體,以確保安全。

注意:這個函數(shù)只應(yīng)該用來處理那些提交過來的數(shù)據(jù),它不適合在一般情況下使用, 因為它的執(zhí)行會有相當(dāng)大的開銷。

使用 XSS 過濾器過濾數(shù)據(jù)可以使用 xss_clean() 方法:

$data = $this->security->xss_clean($data);

它還有一個可選的第二個參數(shù) is_image ,允許此函數(shù)對圖片進行檢測以發(fā)現(xiàn)那些潛在的 XSS 攻擊, 這對于保證文件上傳的安全非常有用。當(dāng)此參數(shù)被設(shè)置為 TRUE 時, 函數(shù)的返回值將是一個布爾值,而不是一個修改過的字符串。如果圖片是安全的則返回 TRUE , 相反, 如果圖片中包含有潛在的、可能會被瀏覽器嘗試運行的惡意信息,函數(shù)將返回 FALSE 。

if ($this->security->xss_clean($file, TRUE) === FALSE)
{
    // file failed the XSS test
}

跨站請求偽造(CSRF)

打開你的 application/config/config.php 文件,進行如下設(shè)置,即可啟用 CSRF 保護:

$config['csrf_protection'] = TRUE;

如果你使用 表單輔助函數(shù) ,form_open() 函數(shù)將會自動地在你的表單中插入一個隱藏的 CSRF 字段。如果沒有插入這個字段, 你可以手工調(diào)用get_csrf_token_name() 和 get_csrf_hash() 這兩個函數(shù)。

$csrf = array(
    'name' => $this->security->get_csrf_token_name(),
    'hash' => $this->security->get_csrf_hash()
);

...

<input type="hidden" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />

令牌(tokens)默認會在每一次提交時重新生成,或者你也可以設(shè)置成在 CSRF cookie 的生命周期內(nèi)一直有效。默認情況下令牌重新生成提供了更嚴格的安全機制,但可能會對 可用性帶來一定的影響,因為令牌很可能會變得失效(譬如使用瀏覽器的返回前進按鈕、 使用多窗口或多標(biāo)簽頁瀏覽、異步調(diào)用等等)。你可以修改下面這個參數(shù)來改變這一點。

$config['csrf_regenerate'] = TRUE;

另外,你可以添加一個 URI 的白名單,跳過 CSRF 保護(例如某個 API 接口希望接受 原始的 POST 數(shù)據(jù)),將這些 URI 添加到 'csrf_exclude_uris' 配置參數(shù)中:

$config['csrf_exclude_uris'] = array('api/person/add');

URI 中也支持使用正則表達式(不區(qū)分大小寫):

$config['csrf_exclude_uris'] = array(
    'api/record/[0-9]+',
    'api/title/[a-z]+'
);

類參考

classCI_Security

xss_clean($str[, $is_image = FALSE])

參數(shù):

  • $str (mixed) -- Input string or an array of strings

返回: XSS-clean data

返回類型: mixed

嘗試移除輸入數(shù)據(jù)中的 XSS 代碼,并返回過濾后的數(shù)據(jù)。 如果第二個參數(shù)設(shè)置為 TRUE ,將檢查圖片中是否含有惡意數(shù)據(jù),是的話返回 TRUE ,否則返回 FALSE 。

sanitize_filename($str[, $relative_path = FALSE])

參數(shù):

  • $str (string) -- File name/path
  • $relative_path (bool) -- Whether to preserve any directories in the file path

返回: Sanitized file name/path

返回類型: string

嘗試對文件名進行凈化,防止目錄遍歷嘗試以及其他的安全威脅,當(dāng)文件名作為用戶輸入的參數(shù)時格外有用。

$filename = $this->security->sanitize_filename($this->input->post('filename'));

如果允許用戶提交相對路徑,譬如 file/in/some/approved/folder.txt ,你可以將第二個參數(shù) $relative_path 設(shè)置為 TRUE 。

$filename = $this->security->sanitize_filename($this->input->post('filename'), TRUE);

get_csrf_token_name()

返回: CSRF token name
返回類型: string

返回 CSRF 的令牌名(token name),也就是 $config['csrf_token_name'] 的值。

get_csrf_hash()

返回: CSRF hash
返回類型: string

返回 CSRF 哈希值(hash value),在和 get_csrf_token_name() 函數(shù)一起使用時很有用,用于生成表單里的 CSRF 字段 以及發(fā)送有效的 AJAX POST 請求。

entity_decode($str[, $charset = NULL])

參數(shù):

  • $str (string) -- Input string
  • $charset (string) -- Character set of the input string

返回: Entity-decoded string

返回類型: string

該方法和 ENT_COMPAT 模式下的 PHP 原生函數(shù) html_entity_decode() 差不多,只是它除此之外,還會檢測不以分號結(jié)尾的 HTML 實體,因為有些瀏覽器允許這樣。

如果沒有設(shè)置 $charset 參數(shù),則使用你配置的 $config['charset'] 參數(shù)作為編碼格式。

get_random_bytes($length)

參數(shù):

  • $length (int) -- Output length

返回: A binary stream of random bytes or FALSE on failure

返回類型: string

這是一種生成隨機字符串的簡易方法,該方法通過按順序調(diào)用 mcrypt_create_iv(), /dev/urandom 和 openssl_random_pseudo_bytes() 這三個函數(shù),只要有一個函數(shù)是可用的,都可以返回隨機字符串。

用于生成 CSRF 和 XSS 的令牌。

注解

輸出并不能保證絕對安全,只是盡量做到更安全。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號