是什么意思使用@Method注释

时间:2014-04-24 06:53:12

标签: symfony annotations symfony-routing

  

路线方法¶有一个快捷方式@Method注释来指定   允许路由的HTTP方法。要使用它,请导入方法   注释命名空间:

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)
    {
    }
}

我见过很多开发人员将Method限制为只有GET或POST, 但由于控制器默认允许两者,为什么开发人员选择将其限制为只有一种方法呢?这是某种安全措施吗?如果是的话会有什么样的攻击来保护你?

3 个答案:

答案 0 :(得分:1)

首先,the spec之后有几种方法可用,而不仅仅是GET和POST

我不认为这是一个安全原因,更重要的是尊重标准(例如REST methods)。 我个人对几种行为使用不同的方法。对我来说,有看版本和应用版本的动作 对于单个URL,这是两种不同的行为。即使最后的响应趋于不改变,控制器级别的行为也是不同的。

我认为这是个人偏好的问题,我更喜欢看

/**
 * @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()
    );
}

它非常清楚它的作用。它只是实现您需要的形式,不处理任何用户输入 现在,您可以通过添加第二种方法来添加处理版本的操作

/**
 * @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()
    );
}

也很容易,并且可以在您的应用程序的其他地方轻松使用(而不是在默认版页面中)

答案 1 :(得分:0)

我个人总是定义一个请求方法(POST,GET,PUT等)。我认为(特别是使用RESTful API')这是透明的。它可以保护您免受某些攻击,因为您限制了可以使用的方法。这也是有道理的,因为如果你登录POST数据并且没有得到它,如果你要求一篇文章,你想要得到它:)看看我的意思?只有它才能让它变得更加透明'我已经抓住了我。我总是喜欢定义这些方法,无论是为了清晰还是其他任何方法。

编辑:Haven尚未看到其他答案(必须在我按下提交按钮时添加:))

答案 2 :(得分:0)

有很多理由可以在POST,GET,PUT和DELETE方法(或Http动词)之间进行选择。首先,使用GET方法存在一些限制,例如,您无法在URL查询字符串或MULTI-PART表单中包含大量数据来上载文件。 关于使用POST和GET方法有很多安全方面的考虑,我甚至不知道从哪里开始。你可以谷歌。最后在RESTful Web服务约定中,CRUD(创建/检索/更新/删除)操作被映射到Http方法(POST / GET / PUT / DELETE)。例如:

path: /student/{id}, method GET returns a student
path: /student, method POST creates a student
path: /student, method PUT updates student info

最重要的安全原因之一是URL通常记录在ISP,Apache Web服务器和网络设备(防火墙......)中,如果您包含敏感数据(如会话ID),...您的数据将会在许多你不知道的地方用纯文本存储。我还建议您查看OWASP top 10