DQL到ORM - Query Builder Symfony

时间:2017-08-16 09:31:59

标签: symfony dql

我实际上有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();

我的第二个问题是"最重要的",我需要将我的请求翻译为使用ORM,正如我的老板说的那样。我考虑过使用查询构建器,但我甚至不确定查询构建器是否为ORM。是吗 ?如果不是,那么我需要使用什么方式才能获得完整的ORM?

2 个答案:

答案 0 :(得分:1)

您的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查询。

我不明白你的老板'要求"使用ORM代替"无论是。我想你可以要求澄清。

答案 1 :(得分:0)

1)如果传递给SQL查询的参数未被正确清理,则您的SQL查询可能容易受SQL injection的影响。

2)查看here以获取 D octrine Q ueryLanguage的完整描述,这是您在DQL中的SQL查询:

$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,它将帮助您构建查询。