ورود

View Full Version : درخواست ajax با post با csrf



numberone1
جمعه 25 تیر 1395, 18:43 عصر
سلام
من یک درخواست میخوام با ajax درست کنم , توی فایل config هم مقدار csrf_protection و مساوی true گذاشتم.
درخواست و ارسال میکنم ارور کد 403 forbiden میگیرم.
وقتی csrf و false میکنم درخواست ارسال میشه و کنترلر دریافت میکنه و جوابش هم بر میگرده
این کد در خواست ajax

$(document).on('click', '#submitInquiry', function (event) {
event.preventDefault();
name = $('#inquiryName').val();
tel = $('#inquiryTel').val();
email = $('#inquiryEmail').val();
var message = $('#inquiryMessage').val();
if ($('#inquiryName').val() == '' || $('#inquiryTel').val() == '' || $('#inquiryEmail').val() == '') {
alert('برای استعلام قیمت پر کردن نام و تلفن و ایمیل اجباری میباشد');
return false;
}
$('#submitInquiry').attr('disabled','disabled');
$.ajax({
type: "POST",
dataType: 'json',
data: {
"name": name, "tel": tel, "email": email, "message": message, "<?php echo $this->security->get_csrf_token_name(); ?>":"<?php echo $this->security->get_csrf_hash(); ?>"

},
url: "/project/site/index.php/inquiry/price",
success: function (data) {
$('#submitInquiry').removeAttr('disabled');
if (data['success']) {
alert(data['success']);
$("#priceInquiry").trigger('reset');
}
if (data['error']) {
alert(data['error']);
}
},
error: function () {
$('#submitInquiry').removeAttr('disabled');
alert('ارتباط با سرور برقرار نشد');
return false;
}
});
});

plague
شنبه 26 تیر 1395, 00:21 صبح
تو کانفیگ csrf_regenerate رو فالز کن ببین حل میشه یا نه

numberone1
شنبه 26 تیر 1395, 22:35 عصر
تو کانفیگ csrf_regenerate رو فالز کن ببین حل میشه یا نه

نه درست نشد
خیلی عجیبه! خیلی سرچ کردم همه همینارو گفتن ولی 403 برمیگردونه!



$config['csrf_protection'] = true;
$config['csrf_token_name'] = 'MY_TOKEN_NAME';
$config['csrf_cookie_name'] = 'CSRF_TOKEN_COOKIE';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = FALSE;
$config['csrf_exclude_uris'] = array();

plague
یک شنبه 27 تیر 1395, 12:40 عصر
به عنوان راه آخر و سریع باید خوده هسته ci رو باز کنی با متغیر ها ور بری تا ببینی مشکل از چیه
من نگاه کردم هسته رو ظاهرا تابع csrf_verify توی system/core/Security.php وظیفه چک کردن توکن رو داره
جاهای مختلفش میتونی exit("flag-1") یا همچین چیزی بزاری تا ببینی کجای کد کار رو خراب میکنه و 403 تولید میکنه
من فکر میکنم از این قسمت باشه که تو توضیحاتش نوشته
// Do the tokens exist in both the _POST and _COOKIE arrays?
احتمالا کوکی شما ست نمیشه

arash_fa
دوشنبه 28 تیر 1395, 23:44 عصر
سلام

دو راه دارید

1:

در کانفیگ


$config['csrf_regenerate'] = false;


$config['csrf_exclude_uris'] = array();

داخل آرایه آدرس هایی که میخواید csrf روش اجرا نشه رو بدید مثلا ajax/test یا bank/charge(.*?)


راه 2:

در تگ head :


<script>$(document).ready(load_first())function load_first(){


var cct = '<?php echo $this->security->get_csrf_hash() ?>'; var get_csrf_token_name = '<?php echo $this->security->get_csrf_token_name() ?>'; $.ajaxSetup({ type:'post', data:{ <?php echo $this->security->get_csrf_token_name() ?> :cct} });
}
</script>

numberone1
پنج شنبه 31 تیر 1395, 15:23 عصر
مرسی از همه دوستانی که جواب دادن بعد از کلی کلنجار رفتن فهمیدم مشکل از کجاست
اگر در فایل کانفیگ همزمان هم در قسمت session encrypt مساوی true باشه و در قسمت کوکی هم قسمت secure cookie مساوی true باشه خود فریم ورک هم نمیتونه به محتوای کوکی کریپت شده دسترسی داشته باشه
یجوری کریپت میکنه که خودش هم نمیتونه بخونتش
خیلی مسخره هست ولی راهش اینه که یا قسمت سشن کریپت بشه یا قسمت کوکی . جفتش همزمان نمیشه