安全類?
安全類包含了一些方法,用于幫助保護你的網站,以免受到跨站請求偽造(CSRF)的攻擊。
加載類?
如果你加載這個類,只是想進行 CSRF 的防護,那就沒必要加載它,因為它是作為一個過濾器運行的,而且沒有手動調用的接口。
如果你想在某種情況下直接訪問這個類,你可以通過服務文件來加載它:
$security = \Config\Services::security();
跨站請求偽造 (CSRF)?
打開你的 application/Config/Filters.php 文件并且全局開啟 csrf 過濾器,即可開啟 CSRF 防護:
public $globals = [
'before' => [
'csrf'
]
];
你可以添加一個 URI 的白名單,跳過 CSRF 保護(例如某個 API 接口希望接受 原始的 POST 數據), 將這些 URI 添加到 csrf 過濾器的 ‘except’ 配置參數中:
public $globals = [
'before' => [
'csrf' => ['except' => ['api/record/save']]
]
];
同樣支持正則表達式(不區分大小寫):
public $globals = [
'before' => [
'csrf' => ['except' => ['api/record/[0-9]+']]
]
];
如果你使用 表單輔助函數 ,form_open()
函數將會自動地在你的表單中插入一個隱藏的 CSRF 字段。如果沒有插入這個字段,
你可以手動調用 get_csrf_token_name()
和 get_csrf_hash()
這兩個函數。
<input type="hidden" name="<?= csrf_token() ?>" value="<?= csrf_hash() ?>" />
另外,你可以使用 csrf_field()
方法來幫你生成這個隱藏的 input
字段:
// Generates: <input type="hidden" name="{csrf_token}" value="{csrf_hash}" />
<?= csrf_field() ?>
令牌(tokens)默認會在每一次提交時重新生成,或者你也可以設置成在 CSRF cookie 的生命周期內一直有效。默認情況下令牌重新生成提供了更嚴格的安全機制,但可能會對 可用性帶來一定的影響,因為令牌很可能會變得失效(例如使用瀏覽器的返回前進按鈕、 使用多窗口或多標簽頁瀏覽、異步調用等等)。你可以修改下面這個參數來改變這一點。
public $CSRFRegenerate = true;
其它的輔助方法?
你將永遠不需要直接使用安全類中的大多數方法。下面的一些方法,你可能會覺得有用,這些方法和 CSRF 防護無關。
sanitizeFilename()
嘗試對文件名進行凈化,防止目錄遍歷嘗試以及其他的安全威脅,這在文件名作為用戶輸入的參數時格外有用。第一個參數是需要凈化的路徑名。
如果用戶輸入包含相對路徑是可以接受的,例如: file/in/some/approved/folder.txt ,那么你可以設置第二個可選參數, $relative_path 為 true 。
$path = $security->sanitizeFilename($request->getVar('filepath'));