ColdFusion Sanatize SQL - PullRequest
       99

ColdFusion Sanatize SQL

0 голосов
/ 18 февраля 2020

Я пытаюсь выполнить l oop над таблицей таблиц и выполнить запрос для каждой таблицы, получая счет от каждой. Не весь код включен, но проблема в cfqueryparam. Когда я запускаю этот код прямо сейчас, появляется сообщение об ошибке «INVALID TABLE NAME». Вот что я сейчас пытаюсь:

<cfloop list="#tableList#" index="t">
<cfquery name="getcount" datasource="erisnetselect">
SELECT COUNT(*) FROM <cfqueryparam value='AUDITOR.#t#' sqltype="VARCHAR">
</cfquery>

Проблема именно в этой строке:

SELECT COUNT(*) FROM <cfqueryparam value='AUDITOR.#t#' sqltype="VARCHAR">

Я также пытался:

SELECT COUNT(*) FROM AUDITOR.<cfqueryparam value='#t#' sqltype="VARCHAR">

Но я получите ту же ошибку.

Я думаю, что может быть способ очистить имена этих таблиц, прежде чем они попадут в запрос, но я не уверен, как это сделать. Если вам нужен весь код, я могу предоставить больше, но это огромная страница.

1 Ответ

3 голосов
/ 19 февраля 2020

cfqueryparam является заполнителем значения для подготовленного утверждения. Нельзя использовать заполнители значений для имен таблиц или столбцов, потому что подготовленный оператор требует, чтобы запрос был завершен и действителен до того, как будут введены какие-либо значения. Одна из целей разработки подготовленных операторов заключается в предотвращении злонамеренного внедрения путем разделения запроса и значений. Разделение достигается отправкой запроса без фактических значений, сначала (заполнители значений обычно обозначаются знаком вопроса ?), анализируют сервер SQL и понимают его (интерпретатор запросов), а затем ждут, когда данные будут помещены в подготовлено значение слотов. Это также дает выигрыш в производительности, поскольку сервер SQL может повторно использовать уже интерпретированные запросы при отправке простого строкового оператора с запросом, а значения всегда требуют его повторного анализа.

Для решения вашей проблемы вам потребуется чтобы очистить имена таблиц, используя соответствующий компоновщик команд / квотер (зависит от поставщика SQL, проверьте драйвер JDB C) или проверьте имя вручную.

Если вам нужно go при ручном способе вы должны быть консервативны и разрешать вводить только надежные символы, такие как буквы алфавита c, цифры, подчеркивания и дефисы. Учтите это:

<cfloop list="#tableList#" index="t">

    <!--- make sure the table name only consists of alphabetic letters, digits, underscores and hyphens --->
    <cfif not reFind("^[a-zA-Z0-9_-]+$", t)>
        <cfthrow message='The specified table name, which is "#t#", contains illegal characters.'>
    </cfif>

    <cfquery name="getcount" datasource="erisnetselect">
        SELECT COUNT(*) FROM AUDITOR.#t#
    </cfquery>

    ...
...