【问题标题】:DQL to ORM - Query Builder SymfonyDQL 到 ORM - 查询生成器 Symfony
【发布时间】:2017-08-16 09:31:58
【问题描述】:

我实际上有 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?

【问题讨论】:

  • Doctrine\ORM\QueryBuilder 绝对是您数据库的 ORM 接口。没有不完整的 ORM。虽然有一个数据库抽象层,doctrine/dbal 库,在其之上构建了doctrine/orm

标签: symfony dql


【解决方案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”。我猜你可以要求澄清。

【讨论】:

  • 这件事是:如果我删除 e.vague_id=v.id 那么其他行上的 e 别名是未知的
  • 这不是真的,e 别名肯定仍然可用。
【解决方案2】:

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

2) 查看 here 以获取 DoctrineQueryLanguage 的完整描述,这是您在 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,它会帮助你构建查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多