2015-05-14 9 views
6

Próbuję parametrize kwerendę, która obecnie pracuje i jest gotowy do ataku SQL injection:parametryzacji ORM kwerendy z którym w klauzuli

qryAwards = ORMExecuteQuery(
    "from Award where awardID in (#form.deleteAwardList#) and Game.Season.User.userID=:uid", 
    {uid=session.userID} 
); 
if(not isNull(qryAwards) and arrayLen(qryAwards)){ 
    for(i in qryAwards){ 
     entityDelete(i); 
    } 
} 

Próbowałem to, o param bez apostrofami:

qryAwards = ORMExecuteQuery(
    "from Award where awardID in (:awardList) and Game.Season.User.userID=:uid", 
    {awardList=form.deleteAwardList, uid=session.userID} 
); 

wciąż otrzymuję następujący błąd:

The value 117,118 cannot be converted to a number.

A to, z param ujęty w apostrofy:

qryAwards = ORMExecuteQuery(
    "from Award where awardID in (':awardList') and Game.Season.User.userID=:uid", 
    {awardList=form.deleteAwardList, uid=session.userID} 
); 

Gets mi następujący błąd:

Invalid parameters specified for the query.

Odpowiedz

6

W HQL (czego użyć, gdy robisz ORMExecuteQuery()) parametrów wykorzystywanych w klauzuli IN należy przekazać jako tablicę. Konwertuj form.deleteAwardList na tablicę. Istnieje kilka różnych sposobów radzenia sobie z tym, ale to zadziała.

qryAwards = ORMExecuteQuery(
    "from Award where awardID in (:awardList) and Game.Season.User.userID=:uid", 
    {awardList=listToArray(form.deleteAwardList), uid=session.userID} 
); 
+0

Dzięki, to działa! – TekiusFanatikus

+0

Z bezczynnej ciekawości, czy to podejście omija apostrofy? –

+1

Powinno. Za każdym razem, gdy parametryzujesz dane takie jak znaki specjalne, są one unikane, tak jak w 'cfparam'. Ponadto, nie można używać 'cfqueryparam' z' ORMExecuteQuery() '. Używając parametrów w taki sposób, w jaki jest, jest taki sam jak przy użyciu 'cfqueryparam' –

Powiązane problemy