2012-04-30 1 views
9

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

The action you have requested is not allowed.

Почему это?

ответ

15

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

+12

Конечно, отключив средства защиты CSRF, вы остаетесь открытым для атак CSRF. –

+0

Спасибо, мне очень помогает проблема с загрузкой файлов с использованием запросов AJAX с помощью Plupload и Codeigniter. – Lix

+7

Я согласен с HighlyIrregular, это на самом деле не решает проблему, она работает вокруг нее и оставляет OP открытой для CSRF-атак. У JoeMoe1984 и Jhourlad Estrella есть лучшие ответы. Мы не должны поощрять менее надежные методы кодирования/разработки. – jkinz

3

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

Мой ответ: Удалить все тире, периоды и любые другие не алфавитно-цифровые символы из значений следующих записей о приложении/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" 

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

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

23

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

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

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

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

делая это таким образом позволит вам оставаться защищенными от атак CSRF и решить эту проблему вы испытываете ,

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

+2

Это должно быть отмечено как правильный ответ –

+1

@AaronBruce Да, к сожалению, я ответил на это год поздно. Надеюсь, он будет достаточно замечен. – JoeMoe1984

+4

Если вы не можете использовать 'form_open()' или 'form_close()', вы можете получить имя и значение токена CSRF, используя '$ this-> security-> get_csrf_hash();' и '$ this-> security-> get_csrf_token_name(); ' – jkinz

2

У меня есть форма, которая была построена вне CI (в Joomla), но что я хотел обработать с помощью CI. Мое решение состояло в том, чтобы выборочно отключить csrf для конкретных источников. Я добавил это в конфигурации, непосредственно после того, как параметры по умолчанию настройки для 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, но оставляет нетронутыми для всех других запросов.

+0

Я знаю, что он старый, но этот подход помогает мне решить проблему использования CKEDITOR, когда csrf включен. Спасибо –

0

Используйте форму CodeIgniter нож, как это:

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

см CodeIgniter форма документации для больше.

0

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

1

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

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

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

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

При просмотре сайта с «mysite.com» (уведомление «WWW» не в адрес), и вы отправляете форму, в которой используется параметр «base_url» CI, как это делает логика CommunityAuth, тогда проверка CSRF завершается с ошибкой, и вы получаете «Запрошенное действие не разрешено». ошибка.

+0

Я думаю, что хорошим решением этой проблемы является выбор «предпочтительного» адреса - с помощью «www» или без - и перенаправление всего трафика на этот предпочтительный адрес с помощью htaccess. В дополнение к решению этой проблемы, это будет препятствовать поисковым системам индексировать www и не-www контент отдельно, что может повредить ранжированию в поисковых системах. Моя запись выглядит следующим образом: '## REWRITE www traffic to root domain' ' RewriteCond% {HTTP_HOST}^www \. (. *) $ [NC] ' ' RewriteRule^(. *) $ Http: // % 1/$ 1 [R = 302, L] ' (FYI - Кажется, я не могу получить разрывы строк, чтобы работать здесь - извините, так неряшливо) – cmpreshn

0

Im Использование Codeigniter 3 такая же проблема с

The action you have requested is not allowed.

Основываясь на точке Айзека Пак, я изменил мою base_url к тому, что я Usally набрал в адресной строке. как это ...

вместо того, чтобы

http://www.domain.org

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

http://domain.org

с момента моего base_url() просто ..

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

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

0

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

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'); 
} 
0

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

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

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

0

Я обнаружил, используя вспомогательные функции формы

Пример

<?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();?> 

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

Смежные вопросы