2015-10-14 2 views
1

Я создаю динамический SQL Query с использованием CFLoop. Я использую CFSaveContent для перебора переменных и построения запроса, а затем я выполняю его в CFQuery с использованием PreserveSingleQuotes. Это работает нормально, но проблема с этим методом заключается в том, что я не могу использовать CFQueryParam, поэтому мой запрос уязвим для инъекций. Было ли интересно, есть ли способ обхода проблемы?PreserveSingleQuotes и CFQueryParam

Update:

<cfsavecontent variable="sqlstring"> 
      SELECT id 
        ,(CASE 
         <cfloop query="qGetRules"> 
          WHEN val1 >=#qGetRules.equ# AND val2 >#arguments.leve# THEN 1 
         </cfloop> 
         ELSE 0 
         END) AS criteria 
      FROM mt4_users 
    </cfsavecontent> 


    <cfquery name="qGetEquity" datasource="mydatasource"> 
     #PreserveSingleQuotes(variables.sqlstring)# 
    </cfquery> 

Итак, на этом примере, как вы можете видеть, что я не могу использовать cfqueryparam для arguments.leve, потому что это приведет к краху на PreserveSingleQuotes

+0

Были ли у вас взгляды на документы в [эквивалентах cfscript cfquery и cfqueryparam] (https://helpx.adobe.com/coldfusion/cfml-reference/script-functions-implemented-as-cfcs/query. HTML)? – Leigh

+1

Теоретически, все мы все время проверяем все поля, предоставленные пользователем. Опираясь только на параметр запроса для обеспечения безопасности, вы не так безопасны, как могли бы быть. Кроме того, у PreserveSingleQuotes есть свое место, но у меня никогда не было успеха с апострофами. –

+0

Поскольку это веб-сервис для мобильных устройств, я не могу проверить вход пользователя (рядом с мобильным приложением). Если кто-то нюхает URL-адрес и пытается ввести SQL, мне нужно его остановить. – BlackM

ответ

0

Хитрость заключается в том, чтобы использовать параметр list от cfqueryparam. Он будет правильно форматировать данные для запроса, экранированные кавычки (если необходимо) и все.

Если список числовых значений (например, в WHERE X IN (1,2,3,4) заявлении):

<cfqueryparam value="#arguments.foo#" cfsqltype="cf_sql_integer" list="true">

Если список строковых значений:

<cfqueryparam value="#arguments.foo#" cfsqltype="cf_sql_varchar" list="true">

Это также работает для cfprocparam ,

+0

Я ничего не вижу в вопросе, который предполагает, что ОП просто генерирует список значений. Кроме того, передача списка числовых значений с помощью 'cfprocparam' не всегда будет достигать цели. Когда я делаю это с помощью sql-сервера, вместо этого я использую параметры табличного значения. –

Смежные вопросы