CI: Почему все мои запросы jqxhr терпят неудачу, когда $ config ['csrf_protection'] = TRUE? - PullRequest
0 голосов
/ 14 февраля 2020

При прохождении моего кода CI 3.1.11 для его очистки (размещенного на локальном хосте XAMPP v2.3.4) кажется, что я сделал что-то, чтобы сервер не принимал любые запросы jqxhr, если у меня есть подделка межсайтовых запросов CI ( csrf) защита работает.

Я использую другие запросы http для получения информации с сервера и внешних файлов, таких как строки в <head>, которые загружают jquery, мой файл css и т. Д. c. Они прекрасно работают независимо от состояния параметра csrf.

Когда я установил: $config['csrf_protection'] = TRUE; Мои запросы jqxhr всегда получают ошибку http 403 (отклоненный запрос, который подразумевает предполагаемую попытку взлома). Мой основной вопрос c состоит в том, чтобы понять, почему это происходит, поэтому я могу исправить это и запустить защиту csrf.

Я не знаю, связано ли это, но я обнаружил, что мне нужно только предоставить контроллер и функция к JQXHR, а не полный URL-адрес. Большинство примеров, которые я видел в Интернете, содержат встроенный код Php для вставки base_url впереди. Кажется, что-то в системе (CI?) Хочет добавить base_url к контроллеру / функции, несмотря ни на что. Если я вставлю его сам, он создаст непригодный URL с base_url, появляющимся дважды.

Если я использую. , , var url= "C_library/updateTitle"; $.post(url, { 'tID':tID, 'newTitle':newTitle }, function(data) { . .

. , , запрос работает, если csrf не запущен. Если защита csrf работает, это будет типичный отчет об ошибке консоли:

XHRPOSThttp://localhost/MZlocal/C_library/updateTitle [HTTP/1.1 403 Forbidden 32ms]

Обратите внимание, что URL сформирован правильно.

Также, вероятно, не имеет значения, но вот мой файл .htaccess, который работает (исключает «index. php» из адресной строки).

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?/$1 [L]

Защита csrf является важной функцией CI, что я действительно хотел бы понять лучше. Любая помощь или подсказки относительно того, где я должен смотреть, приветствуется.

Полная конфигурация csrf. php:

$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Вся идея csrf-protection заключается в том, чтобы токен генерировался вашей CI-структурой и отправлялся на сервер при каждой отправке формы или ajax запросе, чтобы убедиться, что запрос был сделан через ваш веб-сайт. Вы должны отправить токен вместе с запросом, независимо от того, отправляете ли вы обычную форму или делаете запрос ajax. Если вы выполняете запрос ajax , необходимо выполнить 2 шага .

1) Убедитесь, что токен указан в вашем исходном коде , либо с помощью формы CodeIgniter. -helper (который генерирует для вас токен автоматически) или с помощью скрытого поля ввода (например, @Boominathan Elan go уже опубликовано)

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

Вы можете предоставить токен значение во многих отношениях, но в вашем случае это нормально.

2) Затем вам нужно отправить токен вместе с вашим ajax запросом :

В вашем Javascript коде:

// first get the token value from your hidden input field:
var csrfTokenValue = $('input[name=csrf_test_name]').val();

// You Ajax url - check if this here is the right one for you
var ajaxUrl = 'http://localhost/MZlocal/C_library/updateTitle';

$.ajax({
  type: "POST",
  url: ajaxUrl,
  data: {
    'csrf_test_name' : csrfTokenValue,
    'tID': tID,
    'newTitle':newTitle
  },
  success: success,
  dataType: dataType
});

Предполагается, что конфигурация все еще похожа на опубликованную> csrf_test_name в качестве имени токена. Возможно, вам придется немного изменить свой javascript (в соответствии с данными, которые вы хотите отправить с вашим запросом ajax), но в целом он должен работать следующим образом. Ловля ошибок и тд ..

0 голосов
/ 17 февраля 2020

В данных вашей формы вы должны передать маркер безопасности, если CSRF равен TRUE

<input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...