我在这里遇到了一个问题,当我试图用ajax (post)发布一些东西时,我一直得到一个错误。我知道是CSRF给了我这些问题,我一直在试图找到一个解决方案。然而,我希望这里有人能帮助我!
这是我一直得到的错误(从谷歌chrome检查器),
*加载资源失败:服务器响应状态为500(内部服务器错误)XHR完成加载:"http://localhost/woho/ajax/images".*
PHP(控制器)class Ajax extends CI_Controller {
function images() {
echo 'Hello World';
}
}
Javascript 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++;
});
}
}
});
}
我的CCT var从javascript给我正确的令牌或"哈希",但当javascript发送ajax请求编码器返回一个错误,如,
遇到错误您请求的操作是不允许的。
我怎么能解决这个问题?我需要验证CSRF令牌或我的控制器中的东西吗?
我使用Codeigniter 2.0.3
Try (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++;
});
}
}
});
}
检查/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')}
});
如果您使用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一直是我的问题,通过这个方法,它解决了!!
可能有点晚了,但我找到了这个完美的解决方案,有点黑,但应该可以工作
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;
}
2.*
找到解决方法
我面临同样的问题,但现在我已经解决了这个问题。
首先,我在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');
}
});
我希望这段代码会帮助你,因为这是为我工作。
请遵循以下代码:
$.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){}
});