CodeIgniter4 安全類

2020-08-17 17:00 更新

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

加載類

如果你加載這個(gè)類,只是想進(jìn)行 CSRF 的防護(hù),那就沒必要加載它,因?yàn)樗亲鳛橐粋€(gè)過濾器運(yùn)行的,而且沒有手動(dòng)調(diào)用的接口。

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

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

跨站請(qǐng)求偽造 (CSRF)

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

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

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

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

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

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

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

<input type="hidden" name="<?= csrf_token() ?>" value="<?= csrf_hash() ?>" />

另外,你可以使用 csrf_field() 方法來幫你生成這個(gè)隱藏的 input 字段:

// Generates: <input type="hidden" name="{csrf_token}" value="{csrf_hash}" />
<?= csrf_field() ?>

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

public $CSRFRegenerate  = true;

其它的輔助方法

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

sanitizeFilename()

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

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)