CodeIgniter禁止启用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令牌值并再次为下一个请求生成。此请求是合法的, 整个过程将重新开始。

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?