2

路由方法¶ 有一个快捷方式 @Method 注释来指定路由允许的 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,但由于控制器默认允许两者,为什么开发人员选择将其限制为仅一种方法?这是某种安全措施吗?如果是的话,那会保护你免受什么样的攻击?

4

3 回答 3

2

首先,根据规范有几种方法可用,不仅是 GET 和 POST

我认为这不是安全原因,更多的是尊重标准(例如REST 方法)。
我个人对几种行为使用不同的方法。对我来说,有看到版本和应用版本的动作。
这是单个 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()
    );
}

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

于 2014-04-24T07:08:51.667 回答
0

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

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

于 2014-04-24T07:09:23.473 回答
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 前 10 名

于 2014-04-24T07:22:45.433 回答