Codeigniter (CSRF) jQuery ajax 问题
Posted
技术标签:
【中文标题】Codeigniter (CSRF) jQuery ajax 问题【英文标题】:Codeigniter (CSRF) jQuery ajax problem 【发布时间】:2011-11-13 04:33:58 【问题描述】:我在这里遇到了一个问题,当我尝试使用 ajax (POST) 发布内容时,我不断收到错误消息。我知道是 CSRF 给我带来了这些问题,我一直在反复尝试寻找解决方案。但是,我希望这里有人可以帮助我!
这是我不断收到的错误(来自 google chrome 检查器),
*加载资源失败:服务器响应状态为 500(内部服务器错误) XHR 完成加载:“http://localhost/woho/ajax/images”。*
php(控制器)
class Ajax extends CI_Controller
function images()
echo 'Hello World';
var ID = $(".imageWrap:last").attr("id");
var baseurl = "http://localhost/woho/";
var doScroll = 1;
var cct = $.cookie('csrf_cookie_name');
if (location.href == baseurl)
$(window).scroll(function()
if ($(window).scrollTop() > $('body').height() / 2)
if(doScroll == 1)
$.post(baseurl + 'ajax/images','id' : ID, 'csrf_token_name': cct, function(data)
alert(data);
$("#wrapper_content").append(data);
ID++;
);
);
我来自 javascript 的 CCT var 给了我正确的令牌或“哈希”,但是当 javascript 发送 ajax 请求时,codeigniter 返回一个错误,例如,
遇到错误您请求的操作是 不允许。
我该如何解决这个问题?我需要在我的控制器中验证 CSRF 令牌或其他东西吗?
我正在使用 Codeigniter 2.0.3
【问题讨论】:
顺便说一句,在 2.0.3 中没有$this->security->get_csrf_token_name();
这样的东西 @Alfonso Rubalcava 不知道从哪里得到的。
【参考方案1】:
试试(javascript):
var ID = $(".imageWrap:last").attr("id");
var baseurl = "http://localhost/woho/";
var doScroll = 1;
var cct = $.cookie("<?php echo $this->config->item("csrf_cookie_name"); ?>");
if (location.href == baseurl)
$(window).scroll(function()
if ($(window).scrollTop() > $('body').height() / 2)
if(doScroll == 1)
$.post(baseurl + 'ajax/images','id':ID,'<?php echo $this->security->get_csrf_token_name(); ?>': cct, function(data)
alert(data);
$("#wrapper_content").append(data);
ID++;
);
);
【讨论】:
OMFG,Ofc 我需要使用实际名称,而不是 var。哈哈,大佬,谢谢!接下来是隧道视觉?【参考方案2】:检查 /application/config/config.php 中 $config['csrf_token_name']
的默认值设置为 csrf_test_name 而不是 csrf_token_name。
这个决定如果你不想在 Javascript 中使用 PHP 代码。
$.ajax(
url: 'some_url',
type: 'POST',
data: csrf_test_name: $.cookie('csrf_cookie_name')
);
这段代码运行良好。
【讨论】:
【参考方案3】:如果您使用 form_open("/some",'id="some_form"')
和 form_close()
,CI 会创建一个隐藏输入来保留 csrf_token_name 及其值。
所以,在您的 AJAX 请求中,您可以通过序列化获取表单并发送表单!
例如:
<script>
var _form = $("#some_form").serializeArray();
$.ajax(
data: _form,
type: 'post',
url: '<?php echo base_url();?>some',
async: true,
success: function(output)
alert(output);
,
complete: function(output),
fail: function(err)
);
</script>
CSRF 一直是我的问题,通过这种方法,它解决了!!
【讨论】:
【参考方案4】:可能已经晚了,但我发现这个完美的解决方案有点像黑客,但应该可以工作
if (isset($_SERVER["REQUEST_URI"]))
if(stripos($_SERVER["REQUEST_URI"],'/mypage') === FALSE)
$config['csrf_protection'] = TRUE;
else
$config['csrf_protection'] = FALSE;
else
$config['csrf_protection'] = TRUE;
// 在 config.php 文件中 ci 2.*
从this post找到解决方案
【讨论】:
【参考方案5】:我遇到了同样的问题,但现在我已经解决了这个问题。
首先,我在 header.php 中为每个页面创建了 csrf_token,如下代码所示
$csrf = array(
'name' => $this->security->get_csrf_token_name(),
'hash' => $this->security->get_csrf_hash()
);
<script type="text/javascript">
var cct = "<?php echo $csrf ['hash']; ?>";
</script>
之后,当我们通过 ajax 发送特定值时,我们将不得不像下面的代码一样发送 csrf 令牌
$.ajax(
url:"<?php echo APPPATHS.'staff_leave/leaveapproval/getAppliedLeaveDetails'; ?>",
data:id:id,status:status,'<?php echo $this->security->get_csrf_token_name(); ?>': cct,
method:"post",
dataType:"json",
success:function(response)
alert('success');
);
我希望这段代码对你有帮助,因为这对我有用。
【讨论】:
【参考方案6】:只需按照以下代码:
$.ajax(
type : 'post',
url : 'Your URL',
data :
id: id,
'<?php echo $this->security->get_csrf_token_name(); ?>' : '<?php echo $this->security->get_csrf_hash(); ?>'
,
datatype: 'json',
success : function(data)
);
【讨论】:
我认为这与其他答案相同,包括接受的答案。以上是关于Codeigniter (CSRF) jQuery ajax 问题的主要内容,如果未能解决你的问题,请参考以下文章
在 CodeIgniter 中启用 CSRF 为 TRUE [关闭]