本文概述
- 什么是CSRF攻击
- 代币方式
- 启用CSRF保护
- 代币生成
什么是CSRF攻击CSRF攻击迫使登录的受害者的浏览器将伪造的HTTP请求(包括受害者的会话cookie和其他身份验证信息)发送到Web应用程序。
例如, 假设你有一个带有表单的网站。攻击者可以在其站点上创建伪造表单。该表格可能包含隐藏的输入和恶意数据。该表格实际上并未发送到攻击者的网站, 实际上是发送到你的网站的。认为该表格是真实的, 你的站点将对其进行处理。
现在, 仅假设攻击者的表单指向你站点中的删除表单。如果用户登录并重定向到攻击者的网站, 并且在执行搜索时, 该用户的帐户将被删除, 而不会为他所知。那就是CSRF攻击。
代币方式为了防止CSRF, 我们需要同时连接HTTP请求, 表单请求和表单提交。有几种方法可以执行此操作, 但是在CodeIgniter中使用了隐藏字段, 称为CSRF令牌。 CSRF令牌是随每个发送的HTTP请求而变化的随机值。
在网站表单中插入CSRF令牌后, 它也会保存在用户会话中。提交表单后, 网站会同时匹配令牌, 提交的令牌和会话中保存的令牌。如果它们匹配, 则使请求合法。每次加载页面时, 令牌值都会更改, 这使黑客很难猜测当前令牌。
启用CSRF保护要启用CSRF, 请在application / config / config.php文件中的FALSE中使以下语句为TRUE。
$config['csrf_protection'] = TRUE;
代币生成对于每个请求, 都会生成一个新的CSRF令牌。创建对象时, 将设置令牌的名称和值。
$this->
csrf_cookie_name = $this->
csrf_token_name;
$this->
_csrf_set_hash();
它的功能是
function _csrf_set_hash(){if ($this->
csrf_hash == ''){if ( isset($_COOKIE[$this->
csrf_cookie_name] ) AND$_COOKIE[$this->
csrf_cookie_name] != '' ){$this->
csrf_hash = $_COOKIE[$this->
csrf_cookie_name];
} else {$this->
csrf_hash = md5(uniqid(rand(), TRUE));
}}return $this->
csrf_hash;
}
首先, 函数检查cookie的存在。如果存在, 则使用它的当前值, 因为安全实例被多次实例化时, 每个请求都将覆盖前一个请求。
函数还会创建一个全局可用的哈希值, 并将其保存以供进一步处理。令牌的值已生成。现在必须借助form_open()函数将其插入网站的每种形式。
【CodeIgniter禁止启用CSRF】每次发送表单时都会调用方法csrf_verify()。此方法有两件事。如果未收到POST数据, 则设置CSRF cookie。并且如果接收到POST数据, 它将检查提交的值是否与会话中的CSRF令牌值相对应。在第二种情况下, 将丢弃CSRF令牌值并再次为下一个请求生成。此请求是合法的, 整个过程将重新开始。
推荐阅读
- CodeIgniter安全等级
- CodeIgniter登录页面(带有数据库)
- CodeIgniter中的登录表单(不带MySQL)
- CodeIgniter SELECT数据库记录
- CodeIgniter数据库INSERT记录
- CodeIgniter数据库配置
- CodeIgniter驱动程序
- 在CodeIgniter中传递参数
- CodeIgniter钩子用法