# 升级安全

## 文档

- CodeIgniter 3.x 安全类文档

- CodeIgniter 4.x 安全文档

备注

如果使用 表单辅助函数 并全局启用了 CSRF 过滤器，那么 `form_open()` 会自动在表单中插入一个隐藏的 CSRF 字段。因此，不需要手动升级这部分。

## 变更内容

- 在 HTML 表单中实现 CSRF 令牌的方法已发生变化。

## 升级指南

1. 要在 CI4 中启用 CSRF 保护，必须在 app/Config/Filters.php 中启用它：

       <?php

       namespace Config;

       use CodeIgniter\Config\BaseConfig;

       class Filters extends BaseConfig
       {
           // ...

           public $globals = [
               'before' => [
                   // 'honeypot',
                   'csrf',
               ],
           ];

           // ...
       }

2. 在 HTML 表单中，必须移除 CSRF input 字段。它看起来类似于 `<input type="hidden" name="<?= $csrf['name'] ?>" value="<?= $csrf['hash'] ?>" />`。

3. 现在，在 HTML 表单中，必须在表单主体的某处添加 `<?= csrf_field() ?>`，除非使用的是 `form_open()`。

## 代码示例

### CodeIgniter 3.x 版本

    <?php

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

    ?>

    <form>
        <input name="name" type="text">
        <input name="email" type="text">
        <input name="password" type="password">

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

### CodeIgniter 4.x 版本

    <form>
        <input name="name" type="text">
        <input name="email" type="text">
        <input name="password" type="password">

        <?= csrf_field() ?>
        <input type="submit" value="Save">
    </form>