📜  CodeIgniter阻止,从CSRF启用

📅  最后修改于: 2021-01-01 03:38:08             🧑  作者: Mango

阻止,启用CSRF

在本教程中,我们将学习保护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令牌值并再次为下一个请求生成。此请求是合法的,整个过程将重新开始。