2017-08-16 114 views
0

我其實有2個相關的問題。我做了一個DQL請求(她工作正常),但是我的老闆告訴我這是一個安全風險,我不得不使用ORM。我發現這很奇怪,我想知道爲什麼,但是我無法找到任何告訴我爲什麼這是安全風險的東西。DQL到ORM - 查詢生成器Symfony

所以我的第一個問題是你知道爲什麼嗎?

這裏是要求:

$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

'Doctrine \ ORM \ QueryBuilder'絕對是您的數據庫的ORM接口。沒有不完整的ORM。儘管有一個數據庫抽象層,「doctrine/dbal」庫,其上構建了「doctrine/orm」。 – svgrafov

回答

2

確實有在你的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語句是否有效且真正需要?如果你的關聯是正確定義的,那麼Doc​​trine應該自己確定外鍵。

除此之外,我沒有看到在使用DQL任何安全問題。 QueryBuilder對您的案例沒有幫助,因爲它只是提供可鏈式方法來構建您手動編寫的相同DQL查詢。

我不明白你的老闆的要求,即‘使用ORM,而不是’要麼。我想你可以要求澄清。

+0

這件事是:如果我刪除'e.vague_id = v.id'然後在其他行電子別名是未知 – Minirock

+0

這是不正確的'e'別名絕對是仍然可用。 –

1

1)你的SQL查詢很容易受到SQL injection如果傳遞給您的SQL查詢的參數不正確消毒。

2)尋找hered 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,它會幫助你構建查詢。