【问题标题】:codeigniter csrf error on form submission提交表单时出现codeigniter csrf错误
【发布时间】:2012-05-03 17:31:36
【问题描述】:

我有一个使用 codeigniter 括号的表单

echo form_open('signup');

echo form_close();

当我提交它时,我收到以下错误

An Error Was Encountered

The action you have requested is not allowed.

always 但经常...

即使隐藏的输入字段存在于表单中:

<div style="display:none">
<input type="hidden" value="token name is here" name="csrf_token_name">
</div>

这也发生在类似的表单上(登录)

编辑:通过表单生成的 html

<form accept-charset="utf-8" method="post" action="http://www.example.com/signup">
<div style="display:none">
<input type="hidden" value="93565fb5855d31af3d46bd655b11a4a6" name="csrf_token_name">
</div>
<input id="username" type="text" placeholder="Username" maxlength="20" value="" name="username">
<input id="email" type="text" placeholder="Email" value="" name="email">
<input id="password" type="password" placeholder="Password" value="" name="password">
<input id="submit" type="submit" value="Sign up" name="submit">
</form>

【问题讨论】:

  • 请发布为您的表单生成的 HTML 代码。谢谢。
  • 当 $_COOKIE 中的 CSRF 令牌与您的 $_POST['csrf_token_name'] 不匹配时,system/code/Security.php 中的函数 csrf_show_error() 会抛出该特定错误。这里有很多可能导致问题的事情: a) 您是否在发送表单之前发出 AJAX 请求来更改您的 $_COOKIE 令牌? b)您是否正在发出跨域请求?或者也许改变协议?如果您发布与您的应用程序的链接,也许我可以看到发生了什么。
  • 当我执行 ajax 请求时,我没有收到上述错误...这发生在此表单上,从 domain.com(表单所在的位置)将我带到 domain.com/signup 以完成注册。 ..而且这种情况真的很少见...我不是简单地从索引页面到 /signup 进行跨域请求
  • 你 $config['base_url'] 有没有 www?
  • 是的,它有 www...实际上是它的domain.com,如果缺少 www 部分,我也会通过 htaccess 强制...

标签: php forms codeigniter csrf csrf-protection


【解决方案1】:

你做错了。

试试这个

    <input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash();?>" />

该值必须是 codeigniter 为 csrf 令牌计算的值。

或者使用表单助手和codeigniter会自动添加这个隐藏字段。

【讨论】:

  • 隐藏字段是自动添加的,因为我使用了 form_open()...
  • 您可以发布表单的代码吗?如果您已经在使用表单助手,那就有点奇怪了。
  • 你是在使用htaccess来删除url中的index.php吗?
  • 我使用默认的 codeigniter htaccess 只是对其进行了一些编辑,以便在 url 中不存在 www 时始终添加 www...我只设置了 $config['index_page'] = '';
  • try site.com/index.php/controller/method 如果成功,则表示您的 htaccess 没有被覆盖。而且我没有在您的表单操作中看到方法名称。 Post 变量是否进入注册控制器中的索引函数?
【解决方案2】:

在我的例子中,我只是增加了“csrf_expire”变量——令牌应该过期的秒数。

来自 $config['csrf_expire'] = 7200; 到 $config['csrf_expire'] = 28800;

【讨论】:

    【解决方案3】:

    更改 $config['csrf_regenerate'] = TRUE;

    $config['csrf_regenerate'] = FALSE;在配置文件中

    【讨论】:

    • 你能解释一下吗?
    【解决方案4】:

    如果您只想完全摆脱错误...
    绕过它们的最简单的解决方案是:

    1. 打开您的 /config/config.php 文件

    2. 找到下面的行:
      $config['csrf_protection'] = TRUE;

    3. 将其替换为...
      $config['csrf_protection'] = FALSE;

    4. 保存更改。


    注意:关闭 CSRF 保护意味着您可能会受到 CSRF 攻击。

    【讨论】:

    • 为什么会推荐遭受 CSRF 攻击?
    猜你喜欢
    • 2013-07-13
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 2015-10-21
    • 2011-07-28
    相关资源
    最近更新 更多