2

ルート メソッド¶ ルートで許可される HTTP メソッドを指定するためのショートカット @Method アノテーションがあります。これを使用するには、メソッド アノテーションの名前空間をインポートします。

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;

/**
 * @Route("/blog")
 */
class PostController extends Controller
{
    /**
     * @Route("/edit/{id}")
     * @Method({"GET", "POST"})
     */
    public function editAction($id)
    {
    }
}

多くの開発者がメソッドを GET または POST のみに制限しているのを見てきましたが、コントローラーはデフォルトで両方を許可しているのに、なぜ開発者はメソッドを 1 つだけに制限することを選択するのでしょうか? これは何らかのセキュリティ対策ですか?はいの場合、どのような種類の攻撃から保護されますか?

4

3 に答える 3

2

まず、 GET と POST だけでなく、仕様に従っていくつかのメソッドが利用可能です。

これはセキュリティ上の理由ではないと思います。標準を尊重することが問題です (例: REST メソッド)。
私は個人的に、いくつかの行動に対してさまざまな方法を使用しています。私にとっては、エディションを見て、エディションを適用するというアクションがあります。
これは、1 つの URL に対する 2 つの異なる動作です。終盤のレスポンスは変わらなくてもコントローラーレベルでの挙動は違います。

これは個人の好みの問題だと思いますが、むしろ見るのが好きです

/**
 * @Route("/edit")
 * @Method({"GET"})
 * @Template
 */
public function editAction()
{
    $obj = new Foo;
    $obj->setBaz($this->container->getParameter('default_baz'));

    $type = new FooType;

    $form = $this->createForm($type, $obj, array(
        'action' => $this->generateUrl('acme_foo_bar_doedit'),
        'method' => 'PUT'
    ));

    return array(
        'form' => $form->createView()
    );
}

それが何をするのかは明らかです。必要なフォームをインスタンス化するだけで、ユーザー入力は処理されません。
これで、2 番目のメソッドを追加して、エディションを処理するアクションを追加できます。

/**
 * @Route("/edit")
 * @Method({"PUT"})
 * @Template("AcmeFooBundle:Bar:edit.html.twig")
 */
public function doEditAction(Request $request)
{
    $obj = new Foo;
    $type = new FooType;

    $form = $this->createForm($type, $obj, array(
        'action' => $this->generateUrl('acme_foo_bar_doedit'),
        'method' => 'PUT'
    ));

    $form->handleRequest($request);

    if ($form->isValid()) {
        // Play with $obj
    }

    return array(
        'form' => $form->createView()
    );
}

簡単すぎて、アプリケーションの他の場所 (デフォルトのエディション ページではなく) で簡単に使用できます。

于 2014-04-24T07:08:51.667 に答える
0

私は個人的に常にリクエストメソッド(POST、GET、PUTなど)を定義しています。(特に RESTful API の場合) これは透過的だと思います。使用できる方法を制限しているため、一部の攻撃から保護できます。また、POST データにログインして GET せず、記事をリクエストした場合は GET したいので、これも理にかなっています :) 言いたいことがわかりますか? 「それはそれをより透明にする」だけがすでに私を捕まえました. 私は常にメソッドを定義することに夢中になっています.

編集:他の回答はまだ見ていません(送信ボタンを押している間に追加されたに違いありません:))

于 2014-04-24T07:09:23.473 に答える