📅  最后修改于: 2021-01-01 03:38:08             🧑  作者: Mango
在本教程中,我们将学习保护CodeIgniter应用程序免受跨站点请求伪造攻击。它是Web应用程序中最常见的漏洞之一。由于具有内置功能,因此在CodeIgniter中CSRF保护非常容易。
CSRF攻击迫使登录的受害者的浏览器将伪造的HTTP请求(包括受害者的会话cookie和其他身份验证信息)发送到Web应用程序。
例如,假设您有一个带有表单的网站。攻击者可以在其站点上创建伪造表单。该表格可能包含隐藏的输入和恶意数据。该表格实际上并未发送到攻击者的网站,实际上是发送到您的网站的。认为该表格是真实的,您的站点将对其进行处理。
现在,仅假设攻击者的表单指向您站点中的删除表单。如果用户登录并重定向到攻击者的网站,并且在执行搜索时,该用户的帐户将被删除,而不知道他是谁。那就是CSRF攻击。
为了防止CSRF,我们需要同时连接HTTP请求,表单请求和表单提交。有几种方法可以执行此操作,但是在CodeIgniter中使用了隐藏字段,称为CSRF令牌。 CSRF令牌是随发送的每个HTTP请求而变化的随机值。
将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令牌值并再次为下一个请求生成。此请求是合法的,整个过程将重新开始。