Запрошенное действие не допускается ошибка

Я сделал модуль с именем Gallery, который отлично работает на моем локальном хосте с версией 2.0.3, но при использовании версии 2.1.0 на удаленном сайте я не могу отправить форму и получаю ошибку:

Запрошенное вами действие не разрешено.

Почему это?

11 ответов

Решение

Это ошибка Codeigniter, связанная с защитой CSRF. Вы можете отменить это в cms/config/config.php

Я согласен с @Jhourlad Estrella в устранении проблем вместо отключения функции безопасности, однако мне кажется, что настоящая проблема заключается в скрытом поле ввода, содержащем токен.

Вместо использования простого HTML для создания элемента формы используйте form_open() а также form_close() вспомогательные функции. Причина в том, что когда вы используете вспомогательную функцию, она автоматически вставляет маркер csrf в качестве скрытого поля в форме.

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

<input type="hidden" name="csrf_hash_name" value="your-hash-value-here">

Это позволит вам оставаться защищенным от CSRF-атак и решить вашу проблему.

Надеюсь, что это поможет кому-то еще, так как это сводило меня с ума в первый раз, когда я понял это.

В вопросах программирования вы не обходите проблемы, вы их исправляете. Я хочу сказать, что эта функция не будет здесь, если она непригодна для использования: потому что это так, и она работает для меня. У вас просто есть проблема с реализацией.

Мой ответ: Удалите все тире, точки и любые другие не алфавитно-цифровые символы из значений следующих записей в application / config / config.php, как показано ниже:

$config['sess_cookie_name'] = 'mycookiename'; //instead of "my_cookie_name"
$config['csrf_token_name']  = 'mycsrftoken';  //instead of "my.csrf.token"
$config['csrf_cookie_name'] = 'mycsrfcookie'; //instead of "my/csrf/cookie"

Кстати, черточки иногда работают, но я советую по возможности использовать отдельные слова при именовании значений конфигурации. Нет, если у вас нет времени и навыков для изучения основных файлов Codeigniter, связанных с тем, над чем вы работаете, просто чтобы убедиться, что это безопасно.

В любом случае, я надеюсь, что это поможет кому-то там, хотя мой ответ опоздал более чем на год.

У меня есть форма, которая была построена за пределами CI (в Joomla), но я хотел обработать с помощью CI. Мое исправление состояло в том, чтобы выборочно отключить csrf для конкретных рефералов. Я добавил это в config, сразу после параметров конфигурации по умолчанию для csrf:

/* Set csrf off for specific referrers */
$csrf_off = array(
    "http://yourdomain.com/your-form-url",
    "http://yourdomain.com/some-other-url"
);

if (isset($_SERVER["HTTP_REFERER"])) {
    if (in_array($_SERVER["HTTP_REFERER"],$csrf_off)) {
        $config['csrf_protection'] = false;
    }
}

Это отключает защиту csrf для определенных URL-адресов в массиве $csrf_off, но оставляет его нетронутым для всех других запросов.

Я нашел с помощью формы вспомогательные функции

пример

<?php echo form_open('controller/function');?>

<?php echo form_input('username', 'Username');?>

<?php echo form_close();?>

Использование вспомогательных функций, как указано выше, должно прекратить показ сообщения об ошибке CSRF.

Если я не использую echo, form_input(), если я размещу только обычный ввод, при перезагрузке вызовет ошибку CSRF.

<?php echo form_open('controller/function');?>

<input type="text" name="username" />

<?php echo form_close();?>

Поэтому я рекомендую сейчас использовать все вспомогательные функции формы.

Эта ошибка вызывается функцией csrf_show_error() в system/core/Security.php когда токен CSRF в $_COOKIE не совпадает с вашим $_POST['csrf_token_name'].

внутри config.phpЯ должен был убедиться, что $config['cookie_domain'] соответствие $config['base_url']без протокола (т.е. http(s)://).

В противном случае файл cookie не был передан, что означало, что совпадение невозможно.

Это старый вопрос, но эта та же самая проблема стоила мне так много времени, что я хотел поделиться тем, что проблема была в моем случае. Это может кому-то помочь.

Я использую Codeigniter 3.0.6 и CommunityAuth 3 вместе с ним, и я получаю эту ошибку после входа в систему.

Это сбивало с толку, так как проблема иногда возникала, а не в другие времена.

Мой 'base_url' в config.php CI был настроен на что-то вроде 'www.mysite.com'

Когда вы просматриваете сайт с помощью "mysite.com" (обратите внимание, что "www" отсутствует в адресе) и вы отправляете форму, которая использует настройку "base_url" CI, как это делает логин CommunityAuth, проверка CSRF завершается неудачно, и вы получаете "The Запрошенное вами действие не разрешено. ошибка.

Используйте средство открытия формы codeigniter как это:

<php echo form_open(url,method,attributes);?>

см. документацию формы codeigniter для получения дополнительной информации.

Вероятно, это редкий случай, но я не видел своей проблемы, так как на моем сервере много разных доменных имен, которые очень похожи. Проблема заключалась в том, что я приземлился в домене, который был абсолютно неправильным, но, поскольку "Запрошенное вами действие не разрешено". ошибка имеет приоритет над ошибкой " 404 Not Found". Моя проблема заключалась в том, что я не изменил свой base_url на правильный домен. Поэтому, если ни одно из вышеперечисленных решений не работает для вас, вы можете проверить свои настройки для $config['base_url'] в application/config.

Для меня проблема заключалась в том, что я загружал представление в индекс, а затем изменил его, и это сработало:

public function index()
{
    // Load Login Page
    redirect('login/login_page','refresh');

}

public function login_page()
{
    $data['title'] = 'Login Page';

    $this->load->view('templates/header', $data);
    $this->load->view('users/login_view', $data);
    $this->load->view('templates/footer');
}

Я использую Codeigniter 3 та же проблема с

Запрошенное вами действие не разрешено.

Исходя из соображений Исаака Пака, я изменил свой base_url на то, что обычно вводил в адресной строке. как это...

вместо того, чтобы положить

http://www.domain.org

я пишу это так...

http://domain.org

так как мой base_url() просто..

$config['base_url'] = 'http://domain.org/';

исправление работает для моего сайта...

Другие вопросы по тегам