バージョン2.0.3のローカルホストで正常に動作するGalleryという名前のモジュールを作成しましたが、リモートサイトでバージョン2.1.0を使用すると、フォームを送信できず、エラーが発生します。
リクエストしたアクションは許可されていません。
どうしてこれなの?
これは、CSRF保護に関連するCodeigniterエラーです。 cms/config/config.php
でキャンセルできます
セキュリティ機能を無効にする代わりに問題を修正することについて@JhourladEstrellaに同意しますが、本当の問題はトークンを保持する非表示の入力フィールドにあると感じています。
プレーンHTMLを使用してフォーム要素を作成する代わりに、form_open()
およびform_close()
ヘルパー関数を使用します。その理由は、ヘルパー関数を使用すると、フォームの非表示フィールドとしてcsrfトークンが自動的に挿入されるためです。
フォームの非表示の入力フィールドとしてトークンを追加することで、これを手動で行うこともできます
<input type="hidden" name="csrf_hash_name" value="your-hash-value-here">
このようにすることで、CSRF攻撃からの保護を維持し、発生している問題を修正できます。
これが初めてこれを理解するのに私を狂わせたので、これが他の誰かに役立つことを願っています。
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_off配列内の特定のURLに対する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"
ところで、ダッシュが機能することもありますが、構成値に名前を付けるときは、可能な限り1つの単語を使用することをお勧めします。安全を確認するためだけに、これまでに取り組んでいることに関連するCodeigniterのコアファイルを研究する時間とスキルがない限り、そうではありません。
とにかく、私の答えが1年以上遅れているとしても、これが誰かの助けになることを願っています。
フォームヘルパー関数を使用していることがわかりました
例
<?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();?>
したがって、今はすべてのフォームヘルパー関数を使用することをお勧めします。
それは古い質問ですが、この同じ問題は私に非常に多くの時間を要したので、私の場合の問題が何であったかを共有したいと思いました。それは誰かを助けるかもしれません。
Codeigniter3.0.6とCommunityAuth3を一緒に使用していますが、ログイン後にこのエラーが発生していました。
問題が発生することもあれば発生しないこともあるため、混乱を招きました。
CIのconfig.phpの「base_url」が「www.mysite.com」のように設定されました
'mysite.com'でサイトを閲覧し( 'www'がアドレスにないことに注意)、CommunityAuthのログインのようにCIの 'base_url'設定を使用してフォームを送信すると、CSRFチェックが失敗し、 'あなたが要求した行動は許可されていません。エラー。
このエラーは、$ _COOKIEのCSRFトークンが$ _POST ['csrf_token_name']と一致しない場合に、_system/core/Security.php
_の関数csrf_show_error()によってスローされます。
_config.php
_の内部では、プロトコル(つまり、http(s)://
)を使用せずに、_$config['cookie_domain']
_が_$config['base_url']
_と一致することを確認する必要がありました。
それ以外の場合は、Cookieが渡されなかったため、一致させることができませんでした。
これはおそらくまれなケースですが、サーバーには非常によく似た多くの異なるドメイン名があるため、問題は発生しませんでした。問題は、私が完全に間違ったドメインに着陸していたことでしたが、「あなたが要求したアクションは許可されていません」。エラーは「404NotFoundError」よりも優先されます。表示されませんでした。私の問題は、base_urlを正しいドメインに変更しなかったことです。したがって、上記の解決策のいずれも機能しない場合は、application/configの$ config ['base_url']の設定を確認してください。
次のようなcodeigniterフォームオープナーを使用します。
<php echo form_open(url,method,attributes);?>
詳細については、codeigniterフォームのドキュメントを参照してください。
Codeigniter3を使用しているImと同じ問題
リクエストしたアクションは許可されていません。
Isaac Pakの指摘に基づいて、base_urlを通常アドレスバーに入力したものに変更しました。このような...
置く代わりに
_
http://www.domain.org
_
私はそれをこのように書きます。
_
http://domain.org
_
私のbase_url()
はただ..
_
$config['base_url'] = 'http://domain.org/';
_
修正は私のサイトで機能します...
私にとっての問題は、次のように変更して機能するよりも、インデックスにビューをロードしていたことでした。
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');
}