2017-08-16 12 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/orm'が構築されている' doctrine/dbal'ライブラリがあります。 – 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文が有効で本当に必要ですか?あなたの関連が正しく定義されている場合、Doctrineはそれ自身で外部キーを決定する必要があります。

それ以外は、DQLの使用に関するセキュリティ上の問題はありません。 QueryBuilderは、手作業で記述したのと同じDQLクエリを構築するための連鎖可能なメソッドを提供するだけなので、あなたのケースでは役に立ちません。

あなたの上司の「代わりにORMを使用する」リクエストは理解できません。あなたは明確化を求めることができると思います。

+0

これは: 'e.vague_id = v.id'を削除すると、他の行のeエイリアスが不明です – Minirock

+0

これは真実ではなく、' e'エイリアスが利用可能です。 –

1

1)SQLクエリに渡されたパラメータが正しくサニタイズされていない場合、SQLクエリはSQL injectionの脆弱性があります。

2)D octrine Q ueryLanguage、ここDQLであなたのSQLクエリでの完全な説明についてhereを見て:私もあなたがQueryBuilderを勉強示唆

$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() 
; 

、それはあなたを助けますクエリを構築する。

関連する問題