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,它会帮助你构造查询。
我实际上有 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,它会帮助你构造查询。