DQL 到 ORM - 查询生成器 Symfony

DQL to ORM - Query Builder Symfony

我实际上有 2 个相关问题。我提出了 DQL 请求(她工作正常),但我的老板告诉我这是一个安全风险,我不得不改用 ORM。我发现这很奇怪,我想知道为什么,但我找不到任何东西告诉我为什么这是一个安全风险。

所以我的第一个问题是你知道为什么吗?

请求如下:

    $sql="SELECT v.id,v.codeVague, v.date_fin_ultime,c.distance,p.adresse1,p.code_postal,p.ville,m
          FROM McInvestigatorBundle:Vague v
                    INNER JOIN McInvestigatorBundle:Enquete e WITH e.vague_id = v.id
                    INNER JOIN McInvestigatorBundle:Mission m WITH m.id = e.mission_id
                    INNER JOIN McInvestigatorBundle:Contrat c WITH c.id = m.contrat
                    INNER JOIN McInvestigatorBundle:User u WITH u.enqueteur_id = e.enqueteur_id
                    INNER JOIN McInvestigatorBundle:PointDeVente p WITH p.id = e.pdv_id
          WHERE v.codeVague ='".$wave_code."'
                    AND e.type_id =".$type_id."
                    AND m.enqueteur_id=".$enq_id."
                    ORDER BY m.date_rea_prev ASC";
    $results= $em->createQuery($sql)->getResult();

我的第二个问题是 "most important",我需要按照我老板所说的那样翻译我使用 ORM 的请求。我考虑过使用查询生成器,但我什至不确定查询生成器是 ORM。是吗 ?如果不是,我需要使用什么方法来获得完整的 ORM?

您的 DQL 中确实存在安全问题 - 您应该参数化您的查询,否则它可能容易受到 SQL 注入攻击。

'WHERE v.codeVague = :wave_code
    AND e.type_id = :type_id
    AND m.enqueteur_id = :enq_id
ORDER BY m.date_rea_prev ASC';

$results = $em->createQuery($sql)
    ->setParameters([
        'wave_code' => $wave_code,
        'type_id' => $type_id,
        'enq_id' => $enq_id,
    ])->getResult();

DQL 中的 WITH e.vague_id = v.id 语句是否有效且确实需要?如果你的关联定义正确,Doctrine 应该自己确定外键。

除此之外,我没有发现使用 DQL 有任何安全问题。 QueryBuilder 对您的情况没有帮助,因为它只是提供可链接的方法来构建与您手写的相同的 DQL 查询。

我也不明白你们老板对"use ORM instead"的要求。我想你可以要求澄清。

1) 如果传递给 SQL 查询的参数未正确清理,您的 SQL 查询可能容易受到 SQL injection 的攻击。

2) 查看 here 以获得 DoctrineQueryLanguage 的完整描述,这是您的 SQL 在 DQL 中查询:

$sql = "SELECT v.id,v.codeVague, v.date_fin_ultime,c.distance,p.adresse1,p.code_postal,p.ville,m
          FROM McInvestigatorBundle:Vague v
                    INNER JOIN McInvestigatorBundle:Enquete e WITH e.vague_id = v.id
                    INNER JOIN McInvestigatorBundle:Mission m WITH m.id = e.mission_id
                    INNER JOIN McInvestigatorBundle:Contrat c WITH c.id = m.contrat
                    INNER JOIN McInvestigatorBundle:User u WITH u.enqueteur_id = e.enqueteur_id
                    INNER JOIN McInvestigatorBundle:PointDeVente p WITH p.id = e.pdv_id
          WHERE v.codeVague = :wave_code
                    AND e.type_id = :type_id
                    AND m.enqueteur_id = :enq_id
                    ORDER BY m.date_rea_prev ASC";
$results = $em->createQuery($sql)
               ->setParameter('wave_code', $wave_code)
               ->setParameter('type_id', $type_id)
               ->setParameter('enq_id', $enq_id)
               ->getResult()
;

我也建议你研究QueryBuilder,它会帮助你构造查询。