2015-05-14 7 views
6

Ich versuche, eine Abfrage parametrisieren, die derzeit funktioniert und ist für einen SQL-Injection-Angriff reif:parametrieren ORM-Abfrage mit dem in Klausel

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); 
    } 
} 

ich schon versucht, diese, ohne Apostrophe die param mit:

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

ich halte die folgende Fehlermeldung erhalten:

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

Und dies mit dem param in einfache Anführungszeichen eingeschlossen:

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

Ruft mir den folgenden Fehler:

Invalid parameters specified for the query.

Antwort

6

In HQL (das ist, was Sie verwenden, wenn Sie ORMExecuteQuery() tun) Parameter in einem IN-Klausel müssen als ein Array übergeben werden. Sie müssen form.deleteAwardList in ein Array konvertieren. Es gibt ein paar verschiedene Möglichkeiten, damit umzugehen, aber das wird funktionieren.

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

Danke, das funktioniert! – TekiusFanatikus

+0

Entkommt diese Herangehensweise aus Apostroph? –

+1

Es sollte. Jedes Mal, wenn Sie Daten wie diese parametrisieren, werden Sonderzeichen wie in 'cfparam' ausgegeben. Außerdem können Sie 'cfqueryparam' mit' ORMExecuteQuery() 'nicht verwenden. Durch die Verwendung von Parametern, so wie er ist, ist es dasselbe wie die Verwendung von 'cfqueryparam' –

Verwandte Themen