【问题标题】:whats the point of using the @Method annotation使用 @Method 注释的意义何在
【发布时间】:2014-06-09 07:41:50
【问题描述】:

Route Method¶ 有一个快捷方式 @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)
    {
    }
}

我看到很多开发人员将方法限制为仅 GET 或 POST, 但是既然控制器默认允许这两种方法,为什么开发人员选择将其限制为仅一种方法呢?这是某种安全措施吗?如果是的话,那会保护你免受什么样的攻击?

【问题讨论】:

    标签: symfony annotations symfony-routing


    【解决方案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()
        );
    }
    

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

    【讨论】:

      【解决方案2】:

      我个人总是定义一个请求方法(POST、GET、PUT 等)。我认为(尤其是 RESTful API)这是透明的。它可以保护您免受某些攻击,因为您限制了可以使用的方法。这也是有道理的,因为如果您登录 POST 数据但不获取它,并且如果您请求一篇文章,您确实想获取它:) 明白我的意思吗?只有“它让它更透明”已经抓住了我。我总是沉迷于定义方法,无论是为了清晰还是其他。

      编辑:还没有看到其他答案(一定是在我按下提交按钮时添加的:))

      【讨论】:

        【解决方案3】:

        在 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

        【讨论】:

          猜你喜欢
          • 2023-04-05
          • 1970-01-01
          • 2018-06-10
          • 1970-01-01
          • 2011-01-07
          • 1970-01-01
          • 1970-01-01
          • 2010-10-05
          • 1970-01-01
          相关资源
          最近更新 更多