【问题标题】:Couldnt get CSRF to work with ajax (CI 2.1)无法让 CSRF 与 ajax (CI 2.1) 一起使用
【发布时间】:2012-04-30 18:42:38
【问题描述】:

我正在尝试让 CSRF 在我的 CI 2.1 应用程序中使用 ajax。

我对此进行了搜索,发现很少有指导方针,但无法解决问题 http://ericlbarnes.com/post/10728867961/codeigniter-csrf-protection-with-ajax http://www.beheist.com/index.php/en/blog/csrf-protection-in-codeigniter-2-0-a-closer-look http://aymsystems.com/ajax-csrf-protection-codeigniter-20

我在配置中为两个标记值设置了两个不同的标记

$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'token01';
$config['csrf_cookie_name'] = 'token02';
$config['csrf_expire'] = 7200;

这是我的观点,我正在使用 form_open

<?php echo form_open("http://localhost/pis/user"); ?>
<div id="inputs">

<?php echo form_input($username);?>
<?php echo form_password($password);?>
</div>


<div id="actions">

<div style="float:left"><?php echo form_submit($submit);?>

<!-- <input type="button" value="Login" id="submit" name="submit" onclick="clicksubmit()" /> -->

</div>

</div>

<?php echo form_close();?>

我正在使用这个 javascript 进行异步调用

<script type="text/javascript">
$(document).ready(function(){


      $("#submit").click( 

        function(){
            var form_data = {
                username: $("#username").val(),
                password: $("#password").val(),
                csrf_token_name: $("input[name=token01]").val()
            };


            $.ajax({
            type: "POST",
            url: "http://localhost/pis/user",
            data: form_data,
            success: 
              function(data){
                $("#debug").html(data.message).css({'background-color' : data.bg_color}).fadeIn('slow'); 
              }

            });

          return false;

        });


    });

</script>

当我运行此程序时,我收到“500 内部服务器错误”以及“遇到错误,不允许您请求的操作”作为响应。 Firebug 正确显示 POST 数据参数。

例如:username=root&password=root&csrf_token_name=31961f17de5fa2df657ab1aba880f718

如果我删除了 csrf,ajax 请求运行良好,我得到 200 作为响应

谁能帮帮我?

【问题讨论】:

  • 没关系,想通了。我应该在 js 文件中使用令牌名称而不是 csrf_token_name。 token01: $("input[name=token01]").val()
  • 请将此作为问题的答案添加并接受,以便从未回答的堆栈中删除此问题。

标签: codeigniter-2


【解决方案1】:

更好的是,你可以让 jQuery 为你序列化表单数据:

var form_data = $(this).serialize();

这样您就不必担心输入被重命名或添加更多字段。

【讨论】:

    猜你喜欢
    • 2010-10-27
    • 2013-10-07
    • 2014-09-02
    • 1970-01-01
    • 2021-08-19
    • 2018-12-20
    • 2014-10-31
    • 2018-01-02
    • 2016-11-14
    相关资源
    最近更新 更多