为了账号安全,请及时绑定邮箱和手机立即绑定

如何防止 Symfony 中易受攻击实体的延迟加载

如何防止 Symfony 中易受攻击实体的延迟加载

PHP
元芳怎么了 2023-07-07 10:34:56
我的问题很简单,但我在网上搜索了一个小时后没有找到任何线索。我正在尝试构建一个 Symfony API,但是当返回 json 输出时,它会延迟加载输出中的每个关系。虽然这不是什么大问题(在大多数情况下),但当它对用户信息执行此操作时,情况确实很糟糕。因此,所有内容(密码、电子邮件等)都会显示出来。我的问题是:是否可以在学说中将一个实体标记为受保护,这样就不会使用该实体进行自动加载?在某些情况下它非常方便,但这是一个很大的缺陷。如果无法标记实体,是否可以完全停用它或在集合元素上停用它?提前致谢编辑:class User implements UserInterface{    /**     * @ORM\Id()     * @ORM\GeneratedValue()     * @ORM\Column(type="integer")     */    private $id;    /**     * @ORM\Column(type="string", length=180, unique=true)     */    private $email;    /**     * @var string The hashed password     * @ORM\Column(type="string")     */    private $password;    /**     * @ORM\OneToOne(targetEntity="App\Entity\Profile", mappedBy="user", cascade={"persist", "remove"})     */    private $profile;getter 和 setter 都在那里。还有一个 Profile 类,即所有关系的接口。它具有 1to1 的关系。class Profile{    /**     * @ORM\Id()     * @ORM\GeneratedValue()     * @ORM\Column(type="integer")     */    private $id;    /**     * @ORM\OneToOne(targetEntity="App\Entity\User", inversedBy="profile", cascade={"persist", "remove"})     * @ORM\JoinColumn(nullable=false)     */    private $user;getter 和 setter 就在那里。class Event{    /**     * @ORM\Id()     * @ORM\GeneratedValue()     * @ORM\Column(type="integer")     */    private $id;    /**     * @ORM\Column(type="datetime")     */    private $date;    /**     * @ORM\ManyToOne(targetEntity="App\Entity\Profile", inversedBy="ownedEvents")     * @ORM\JoinColumn(nullable=false)     */    private $profile;    /**     * @ORM\OneToMany(targetEntity=Post::class, mappedBy="event", orphanRemoval=true)     */    private $posts;问题是,该配置文件已加载,用户也可以使用它......以下是控制器功能。但序列化是在额外的方法中进行的。public function getUnreactedEvents(): JsonResponse{        $events = $this->getDoctrine()            ->getManager()            ->getRepository(Event::class)            ->getUnreactedEvents($this->profileUtils->getLoggedInProfileFromDatabase()->getId());        return new JsonResponse($this->eventUtils->eventsToArray($events));    }
查看完整描述

1 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

我建议使用JMSSerializerBundle来实现这一点。它是一个广泛使用的捆绑包,也有大量的 API。您可以准确配置哪些属性应该公开,哪些不应该公开。您还可以构建用于公开属性的组并使用特定的排除策略。

提示:还要检查深层嵌套对象的限制序列化深度。


查看完整回答
反对 回复 2023-07-07
  • 1 回答
  • 0 关注
  • 80 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信