少し前にSlim 2を使ってアプリを作成しましたが、Angularを追加しようとしています。これまではうまくいっていますが、Angularがすべての投稿要求を処理しているので、私が使用していたCSRF保護機能を使用することはできません。以下は私が働いていたミドルウェアの前のものです。SlimアプリにAngular XSRFを追加する - これは音ですか?
<?php
namespace Cache\Middleware;
use Exception;
use Slim\Middleware;
class CsrfMiddleware extends Middleware {
protected $key;
public function call() {
$this->key = $this->app->config->get('csrf.key');
$this->app->hook('slim.before', [$this, 'check']);
$this->next->call();
}
public function check() {
if (!isset($_SESSION[$this->key])) {
$_SESSION[$this->key] = $this->app->hash->hash($this->app->randomlib->generateString(128));
}
$token = $_SESSION[$this->key];
if (in_array($this->app->request()->getMethod(), ['POST', 'PUT', 'DELETE'])) {
$submittedToken = $this->app->request()->post($this->key) ?: '';
if (!$this->app->hash->hashCheck($token, $submittedToken)) {
throw new Exception('CSRF token mismatch');
}
}
$this->app->view()->appendData([
'csrf_key' => $this->key,
'csrf_token' => $token
]);
}
}
私は、角度が自動的にXSRF-TOKENという名前のトークンを探し、X-XSRF-TOKENとしてヘッダに追加することを知っています。下のミドルウェアを修正して、正しい値の書き込み、読み取り、比較を行うにはどうすればよいですか。
EDIT:これまで
$submittedToken = $this->app->request()->post($this->key) ?: '';
::私が正しい場合
$submittedToken = $this->app->request->headers->get('X-XSRF-TOKEN') ?: '';
再びこれを見て、スリムなドキュメントを確認した後、私はラインを変更これは$ submittedTokenに、X-XSRF-TOKENとして渡された値をヘッダに代入します。ミドルウェア「CSRFトークンの不一致」からのメッセージで例外がスローされます。これは進歩のように感じる。 PHPコードが今立っている場所の下
がある
app.controller('itemsCtrl', ['$scope', '$http', function($scope, $http) {
// Initailize object when the page first loads
$scope.getAll = function() {
$http.post('/domain.com/admin/getNames').success(function(data) {
$scope.names = data;
});
}
EDIT:以下は、関連する角度です。私はこれが働いていると思う。フォームを送信する前に、クッキーを削除するか$トークンの値を変更すると、予想されるCSRFエラーが発生しました。私は、複数のユーザーがいるときに何が起こるか少し気になります。私はまだそれをテストしていない。このリビジョンに基づいて、保護は健全に見えますか? Angular docs for $http Cross Site Request Forgery (XSRF) Protectionから
<?php
namespace Cache\Middleware;
use Exception;
use Slim\Middleware;
class CsrfMiddleware extends Middleware {
protected $key;
public function call() {
$this->key = $this->app->config->get('csrf.key');
$this->app->hook('slim.before', [$this, 'check']);
$this->next->call();
}
public function check() {
// if (!isset($_SESSION[$this->key])) {
if (!isset($_SESSION[$this->key])) {
// $_SESSION[$this->key] = $this->app->hash->hash($this->app->randomlib->generateString(128));
$this->app->setcookie($this->key, $this->app->hash->hash($this->app->randomlib->generateString(128)));
}
// $token = $_SESSION[$this->key];
if(isset($_COOKIE[$this->key])) {
$token = $_COOKIE[$this->key];
}
if (in_array($this->app->request()->getMethod(), ['POST', 'PUT', 'DELETE'])) {
// $submittedToken = $this->app->request()->post($this->key) ?: '';
$submittedToken = $this->app->request->headers->get('X-XSRF-TOKEN') ?: '';
if (!$this->app->hash->hashCheck($token, $submittedToken)) {
throw new Exception('CSRF token mismatch');
}
}
}
}
私はそれが他のところで実装されているのを見ました。今は、csrf.keyの名前をXSRF-TOKENに変更し、Angularによってピックアップされるようにしました。それが動作しているかどうかをテストする方法がわかりません。ミドルウェアにヘッダ名を読み込ませる方法もわからないのですか? – user2530671