1

「Get」リクエストで URL を呼び出すと、問題なく応答を取得できます。

ただし、「Post」リクエストで同じ URL を呼び出すと、「bad request」が返されます。なぜこれが起こっているのかについての提案/アイデアはありますか?

index.php ファイルのコード:

//GET Request: This works fine!

$app->get('/api/ss20/registration/?', function () use ($app) {
            echo "hello-get";
});


//POST Request: This gives a bad request error!

$app->post('/api/ss20/registration/?', function () use ($app) {
            echo "hello-post";
});

get リクエストを作成するために使用している単純なフォームは次のとおりです。

<form action="api/ss20/registration/" method="get">
  First name: <input type="text" name="fname"><br>
  Last name: <input type="text" name="lname"><br>
  <input type="submit" value="Submit">
</form>

投稿リクエストを作成するために使用している簡単なフォーム:

<form action="api/ss20/registration/" method="post">
  First name: <input type="text" name="fname"><br>
  Last name: <input type="text" name="lname"><br>
  <input type="submit" value="Submit">
</form>

postman / Arc を使用してリクエストをシミュレートしてみました。また、取得リクエストは正常に機能しますが、投稿は機能しません。

4

2 に答える 2

1

API URL をホワイトリストに登録するには、middleware/CsrfGuard.php を変更する必要がありました

次の if ステートメントを追加しました。/api/ss20/registration への POST リクエストが無視されることを確認します。

if (!(in_array($this->app->request()->getMethod(), array('POST')) && $uri->getPath() == "/api/ss20/registration"))
        {
            if (in_array($this->app->request()->getMethod(), array('POST', 'PUT', 'DELETE')))  {

                 //error_log("\n".date(DATE_RSS)." Inside CSRF Validation",3, "/tmp/php-error.log");

                $userToken = $this->app->request()->post($this->key);
                if ($token !== $userToken) {
                    //error_log("\n".date(DATE_RSS)." About to send halt-400",3, "/tmp/php-error.log");
                    $this->app->alerts->addMessage('danger', 'Invalid or missing CSRF token.');
                    $this->app->halt(400);
                }
            }
}

ありがとう@alexw

于 2016-07-26T17:45:17.293 に答える
1

CSRFトークン 400が見つからないため、不正なリクエスト エラーが発生する可能性があります。

バージョン 0.3.1 では、UserFrosting は CSRF トークンを<meta>ページのタグ内の特別なタグに保存します<head>。たとえば、account/settingsページのソースを見ると、次のように表示されます。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="Update your account settings, including email, display name, and password.">
    <meta name="author" content="Alex Weissman">
    <meta name="csrf_token" content="583caa307d5c1027a8983251f13a3fe994050001d871e329b16599a29858652891a10c48535c6e4be0580c87503f210072ca83c0a45d49c0d0941b5b2536aa15"> 

    <title>UserFrosting | Account Settings</title>
    ...

したがって、どういうわけか、その値をcsrf_tokenPOST 送信に取得する必要があります。関数を使用してJavascriptでフォームを送信すると、通常、UserFrostingはこれを自動的に行いufFormSubmitます。

次の行に気付くでしょう。

// Append page CSRF token
var csrf_token = $("meta[name=csrf_token]").attr("content");
serializedData += "&csrf_token=" + encodeURIComponent(csrf_token); 

これらは単にタグcsrf_tokenから値を取得<meta>し、フォームのデータに追加します。この関数を呼び出すには、ページに Javascript エラーがないことを確認する必要があることに注意してください。そうしないと、ほとんどのブラウザが静かに「従来の」フォーム送信をデフォルトにし、CSRF トークンがフォームに追加されません。

本当に「従来の」方法でフォームを送信したい場合は、CSRF トークンを非表示フィールドとして Twig テンプレートに直接挿入できます。追加するだけ

<input type="hidden" name="{{csrf_key}}" value="{{csrf_token}}">

あなたのフォームに。UserFrosting と CSRF トークンの詳細については、こちら を参照してください。

于 2016-07-23T16:47:58.263 に答える