W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
安全類包含了一些方法,用于安全的處理輸入數(shù)據(jù),幫助你創(chuàng)建一個(gè)安全的應(yīng)用。
CodeIgniter 自帶了一個(gè) XSS 過(guò)濾器來(lái)防御攻擊,它可以設(shè)置為自動(dòng)運(yùn)行過(guò)濾 所有遇到的 POST 和 COOKIE 數(shù)據(jù),也可以針對(duì)某一條數(shù)據(jù)進(jìn)行過(guò)濾。默認(rèn)情況下 它不是全局運(yùn)行的,因?yàn)樗鼤?huì)有相當(dāng)?shù)拈_銷,況且你并不是在所有地方都需要它。
XSS 過(guò)濾器會(huì)查找那些常被用來(lái)觸發(fā) JavaScript 腳本或者其他類型的企圖劫持 Cookie 或者其它惡意行為的代碼。如果發(fā)現(xiàn)任何不允許的內(nèi)容,它將把那些內(nèi)容 轉(zhuǎn)換為字符實(shí)體,以確保安全。
注意:這個(gè)函數(shù)只應(yīng)該用來(lái)處理那些提交過(guò)來(lái)的數(shù)據(jù),它不適合在一般情況下使用, 因?yàn)樗膱?zhí)行會(huì)有相當(dāng)大的開銷。
使用 XSS 過(guò)濾器過(guò)濾數(shù)據(jù)可以使用 xss_clean() 方法:
$data = $this->security->xss_clean($data);
它還有一個(gè)可選的第二個(gè)參數(shù) is_image ,允許此函數(shù)對(duì)圖片進(jìn)行檢測(cè)以發(fā)現(xiàn)那些潛在的 XSS 攻擊, 這對(duì)于保證文件上傳的安全非常有用。當(dāng)此參數(shù)被設(shè)置為 TRUE 時(shí), 函數(shù)的返回值將是一個(gè)布爾值,而不是一個(gè)修改過(guò)的字符串。如果圖片是安全的則返回 TRUE , 相反, 如果圖片中包含有潛在的、可能會(huì)被瀏覽器嘗試運(yùn)行的惡意信息,函數(shù)將返回 FALSE 。
if ($this->security->xss_clean($file, TRUE) === FALSE)
{
// file failed the XSS test
}
打開你的 application/config/config.php 文件,進(jìn)行如下設(shè)置,即可啟用 CSRF 保護(hù):
$config['csrf_protection'] = TRUE;
如果你使用 表單輔助函數(shù) ,form_open() 函數(shù)將會(huì)自動(dòng)地在你的表單中插入一個(gè)隱藏的 CSRF 字段。如果沒(méi)有插入這個(gè)字段, 你可以手工調(diào)用get_csrf_token_name() 和 get_csrf_hash() 這兩個(gè)函數(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)默認(rèn)會(huì)在每一次提交時(shí)重新生成,或者你也可以設(shè)置成在 CSRF cookie 的生命周期內(nèi)一直有效。默認(rèn)情況下令牌重新生成提供了更嚴(yán)格的安全機(jī)制,但可能會(huì)對(duì) 可用性帶來(lái)一定的影響,因?yàn)榱钆坪芸赡軙?huì)變得失效(譬如使用瀏覽器的返回前進(jìn)按鈕、 使用多窗口或多標(biāo)簽頁(yè)瀏覽、異步調(diào)用等等)。你可以修改下面這個(gè)參數(shù)來(lái)改變這一點(diǎn)。
$config['csrf_regenerate'] = TRUE;
另外,你可以添加一個(gè) URI 的白名單,跳過(guò) CSRF 保護(hù)(例如某個(gè) API 接口希望接受 原始的 POST 數(shù)據(jù)),將這些 URI 添加到 'csrf_exclude_uris' 配置參數(shù)中:
$config['csrf_exclude_uris'] = array('api/person/add');
URI 中也支持使用正則表達(dá)式(不區(qū)分大小寫):
$config['csrf_exclude_uris'] = array(
'api/record/[0-9]+',
'api/title/[a-z]+'
);
classCI_Security
xss_clean($str[, $is_image = FALSE])
參數(shù):
返回: XSS-clean data
返回類型: mixed
嘗試移除輸入數(shù)據(jù)中的 XSS 代碼,并返回過(guò)濾后的數(shù)據(jù)。 如果第二個(gè)參數(shù)設(shè)置為 TRUE ,將檢查圖片中是否含有惡意數(shù)據(jù),是的話返回 TRUE ,否則返回 FALSE 。
sanitize_filename($str[, $relative_path = FALSE])
參數(shù):
返回: Sanitized file name/path
返回類型: string
嘗試對(duì)文件名進(jìn)行凈化,防止目錄遍歷嘗試以及其他的安全威脅,當(dāng)文件名作為用戶輸入的參數(shù)時(shí)格外有用。
$filename = $this->security->sanitize_filename($this->input->post('filename'));
如果允許用戶提交相對(duì)路徑,譬如 file/in/some/approved/folder.txt ,你可以將第二個(gè)參數(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ù)一起使用時(shí)很有用,用于生成表單里的 CSRF 字段 以及發(fā)送有效的 AJAX POST 請(qǐng)求。
entity_decode($str[, $charset = NULL])
參數(shù):
返回: Entity-decoded string
返回類型: string
該方法和 ENT_COMPAT 模式下的 PHP 原生函數(shù) html_entity_decode() 差不多,只是它除此之外,還會(huì)檢測(cè)不以分號(hào)結(jié)尾的 HTML 實(shí)體,因?yàn)橛行g覽器允許這樣。
如果沒(méi)有設(shè)置 $charset 參數(shù),則使用你配置的 $config['charset'] 參數(shù)作為編碼格式。
get_random_bytes($length)
參數(shù):
返回: A binary stream of random bytes or FALSE on failure
返回類型: string
這是一種生成隨機(jī)字符串的簡(jiǎn)易方法,該方法通過(guò)按順序調(diào)用 mcrypt_create_iv(), /dev/urandom 和 openssl_random_pseudo_bytes() 這三個(gè)函數(shù),只要有一個(gè)函數(shù)是可用的,都可以返回隨機(jī)字符串。
用于生成 CSRF 和 XSS 的令牌。
注解
輸出并不能保證絕對(duì)安全,只是盡量做到更安全。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: