我正在使用URL中某些实体的id来指定对特定元素的处理。路由文件在某种程度上是这样的:
UpdateUser:
pattern: /UpdateUser/{id}
defaults: { _controller: AfricaClientBundle:Secteur:UpdateUser }
在网址中我得到这样的内容:
http://127.0.0.1/Symfony/web/app_dev.php/UpdateUser/215
这根本不安全。关于如何隐藏它或做什么的任何提示。
答案 0 :(得分:0)
如果您不想在页面或网址中向您的用户显示您的实体ID,则必须为每个实体定义一个唯一属性,该属性可以是“公共”。
在User
案例中,您通常可以设置email
或username
属性Unique
,然后只在您的网址中提供这些属性。这样,就不可能通过在URL中增加一些id来“耕种”用户数据库。
这种行为不仅更安全,而且更漂亮,更友好,而且在您的网址中隐藏了数字。
最佳
答案 1 :(得分:0)
正如@ihsan之前所回答的那样,在您的网址中使用ID并不是一个安全问题。作为ID的替代方案,您可以使用Doctrine Sluggable Extension。 请记住,如果仅引用一个对象,则参数仍应是唯一的。 Sluggable还提供了一些SEO优势。
答案 2 :(得分:0)
在这种情况下,如果您只希望用户能够更新自己,您应该只省略URL中的$id
并从security.context中读取控制器。
$user = $this->get('security.context')->getToken()->getUser();
这应该从当前登录的任何人加载User
实体。 [...]->getUser()->getId()
应该为您提供$id
。
如果您不希望这只适用于UpdateUsuarioAction,想要更通用的东西,则应使用POST
而不是GET
,或者可以完全省略该变量并将其存储在会话中。请注意,使用POST
并不是更安全,因为用户可以修改POST
数据。它只需要更多的工作。
通常,传递ID并不安全,这取决于您的软件规则。