Какой смысл использовать аннотацию @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, но, поскольку контроллер допускает оба метода по умолчанию, почему разработчики предпочитают ограничивать его только одним методом? это какая-то мера безопасности? и если да, то от каких атак это защитит вас?
3 ответа
Во-первых, есть несколько методов, доступных по спецификации, не только 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()
);
}
Это также просто и может быть легко использовано в другом месте вашего приложения (а не на странице издания по умолчанию)
Есть много причин выбирать между методами POST, GET, PUT и DELETE (или глаголами Http). Прежде всего, существуют некоторые ограничения в использовании метода GET, например, вы не можете включать большой объем данных в строку запроса URL или формы MULTI-PART для загрузки файлов. И есть много вопросов безопасности при использовании методов POST и GET, и я даже не знаю, с чего начать. Вы можете Google это. И, наконец, в соглашении о веб-службах RESTful операции 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-адреса обычно регистрируются в интернет-провайдерах, веб-сервере Apache и сетевых устройствах (брандмауэры, ...), и если вы включите конфиденциальные данные, такие как идентификаторы сеансов,... ваши данные будут храниться в простой текст во многих местах, о которых вы даже не подозреваете. Также я рекомендую взглянуть на OWASP top 10.
Я лично ВСЕГДА определяю метод запроса (POST, GET, PUT и т. Д.). Я думаю, что (особенно с RESTful API) это прозрачно. Это может защитить вас от некоторых атак, потому что вы ограничиваете методы, которые можно использовать. Это также имеет смысл, потому что если вы входите в систему с данными POST и не получаете их, а если запрашиваете статью, вы действительно хотите получить ее:) Видите, что я имею в виду? Только "это делает его более прозрачным" уже поймало меня. Я привязан к тому, чтобы всегда определять методы, будь то только для ясности или чего-то еще.
изменить: еще не видел другой ответ (должно быть, был добавлен, когда я нажал кнопку отправки:))