我实际上有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?
答案 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,它将帮助您构建查询。