Codeigniter CSRF 保护 VS 选项卡
Codeigniter CSRF protection VS tabs
在最新的 CodeIgniter v3 中,CSRF 令牌只有一次有效。结果,我在处理多个标签时遇到了一些麻烦:
- 使用 Form1 打开一个选项卡
- 用 Form2 打开一个标签页
- 使用表格 1 提交选项卡
- 使用表格 2 提交选项卡
第 4 步将导致 CSRF 错误。显然这并不理想...如何解决这个问题?
背景
无需在每次提交表单时重新生成 CSRF 令牌。几乎没有安全优势——如果攻击者可以从您的页面检索令牌,那么他们就已经赢了。这将使您的站点能够 运行 无错误地交叉表。
有关安全方面的一些背景信息,请参阅此页面:Why [you shouldn't] refresh CSRF token per form request?。
CodeIgniter v3
v3 使用名为csrf_regenerate
的配置项。将此设置为 FALSE
以防止在每次请求后重新生成。
CodeIgniter v2
CodeIgniter 使用的代码在 post:CSRF Protection in CodeIgniter 2.0: A closer look 中讨论。相关代码如下:
function csrf_verify()
{
// If no POST data exists we will set the CSRF cookie
if (count($_POST) == 0)
{
return $this>csrf_set_cookie();
}
// Do the tokens exist in both the _POST and _COOKIE arrays?
if ( ! isset($_POST[$this->csrf_token_name]) OR
! isset($_COOKIE[$this->csrf_cookie_name]) )
{
$this->csrf_show_error();
}
// Do the tokens match?
if ( $_POST[$this->csrf_token_name]
!= $_COOKIE[$this->csrf_cookie_name] )
{
$this->csrf_show_error();
}
// We kill this since we're done and we don't
// want to polute the _POST array
unset($_POST[$this->csrf_token_name]);
// Re-generate CSRF Token and Cookie
unset($_COOKIE[$this->csrf_cookie_name]);
$this->_csrf_set_hash();
$this->csrf_set_cookie();
log_message('debug', "CSRF token verified ");
}
只需从函数中删除以下代码:
// Re-generate CSRF Token and Cookie
unset($_COOKIE[$this->csrf_cookie_name]);
$this->_csrf_set_hash();
$this->csrf_set_cookie();
在最新的 CodeIgniter v3 中,CSRF 令牌只有一次有效。结果,我在处理多个标签时遇到了一些麻烦:
- 使用 Form1 打开一个选项卡
- 用 Form2 打开一个标签页
- 使用表格 1 提交选项卡
- 使用表格 2 提交选项卡
第 4 步将导致 CSRF 错误。显然这并不理想...如何解决这个问题?
背景
无需在每次提交表单时重新生成 CSRF 令牌。几乎没有安全优势——如果攻击者可以从您的页面检索令牌,那么他们就已经赢了。这将使您的站点能够 运行 无错误地交叉表。
有关安全方面的一些背景信息,请参阅此页面:Why [you shouldn't] refresh CSRF token per form request?。
CodeIgniter v3
v3 使用名为csrf_regenerate
的配置项。将此设置为 FALSE
以防止在每次请求后重新生成。
CodeIgniter v2
CodeIgniter 使用的代码在 post:CSRF Protection in CodeIgniter 2.0: A closer look 中讨论。相关代码如下:
function csrf_verify()
{
// If no POST data exists we will set the CSRF cookie
if (count($_POST) == 0)
{
return $this>csrf_set_cookie();
}
// Do the tokens exist in both the _POST and _COOKIE arrays?
if ( ! isset($_POST[$this->csrf_token_name]) OR
! isset($_COOKIE[$this->csrf_cookie_name]) )
{
$this->csrf_show_error();
}
// Do the tokens match?
if ( $_POST[$this->csrf_token_name]
!= $_COOKIE[$this->csrf_cookie_name] )
{
$this->csrf_show_error();
}
// We kill this since we're done and we don't
// want to polute the _POST array
unset($_POST[$this->csrf_token_name]);
// Re-generate CSRF Token and Cookie
unset($_COOKIE[$this->csrf_cookie_name]);
$this->_csrf_set_hash();
$this->csrf_set_cookie();
log_message('debug', "CSRF token verified ");
}
只需从函数中删除以下代码:
// Re-generate CSRF Token and Cookie
unset($_COOKIE[$this->csrf_cookie_name]);
$this->_csrf_set_hash();
$this->csrf_set_cookie();