CodeIgniter4 安全類

2020-08-17 17:00 更新

安全類包含了一些方法,用于幫助保護你的網(wǎng)站,以免受到跨站請求偽造(CSRF)的攻擊。

加載類

如果你加載這個類,只是想進行 CSRF 的防護,那就沒必要加載它,因為它是作為一個過濾器運行的,而且沒有手動調(diào)用的接口。

如果你想在某種情況下直接訪問這個類,你可以通過服務(wù)文件來加載它:

$security = \Config\Services::security();

跨站請求偽造 (CSRF)

打開你的 application/Config/Filters.php 文件并且全局開啟 csrf 過濾器,即可開啟 CSRF 防護:

public $globals = [
        'before' => [
                'csrf'
        ]
];

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

public $globals = [
        'before' => [
                'csrf' => ['except' => ['api/record/save']]
        ]
];

同樣支持正則表達式(不區(qū)分大小寫):

public $globals = [
            'before' => [
                    'csrf' => ['except' => ['api/record/[0-9]+']]
            ]
    ];

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

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

public $CSRFRegenerate  = true;

其它的輔助方法

你將永遠不需要直接使用安全類中的大多數(shù)方法。下面的一些方法,你可能會覺得有用,這些方法和 CSRF 防護無關(guān)。

sanitizeFilename()

嘗試對文件名進行凈化,防止目錄遍歷嘗試以及其他的安全威脅,這在文件名作為用戶輸入的參數(shù)時格外有用。第一個參數(shù)是需要凈化的路徑名。

如果用戶輸入包含相對路徑是可以接受的,例如: file/in/some/approved/folder.txt ,那么你可以設(shè)置第二個可選參數(shù), $relative_path 為 true 。

$path = $security->sanitizeFilename($request->getVar('filepath'));
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號