本文概述
在本教程中, 我们将学习保护CodeIgniter应用程序免受跨站点请求伪造攻击。它是Web应用程序中最常见的漏洞之一。由于具有内置功能, 因此在CodeIgniter中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()函数将其插入网站的每种形式。
每次发送表单时都会调用方法csrf_verify()。此方法有两件事。如果未收到POST数据, 则设置CSRF cookie。并且如果接收到POST数据, 它将检查提交的值是否与会话中的CSRF令牌值相对应。在第二种情况下, 将丢弃CSRF令牌值并再次为下一个请求生成。此请求是合法的, 整个过程将重新开始。