Защита поведения сервера Dreamweaver ColdFusion от уязвимости к атакам с внедрением SQL-кода.
Риск безопасности, связанный с атаками с внедрением SQL-кода
Некоторые базы данных позволяют отправлять несколько операторов SQL в одном запросе. В связи с этим при передаче параметров в строке запроса к динамически генерируемому запросу базы данных возникают потенциальные риски безопасности. Хакеры могут попытаться изменить URL или переменные формы в динамическом запросе посредством присоединения вредоносных операторов SQL к существующим параметрам. Это часто называют атакой с внедрением SQL. Некоторые коды поведения сервера, созданные Dreamweaver, для снижения риска таких атак должны быть изменены. Более подробная информация о внедрении SQL-кода приведена в статье Википедии.
Примечание. Проблема, описанная в данной статье, была решена в Средстве обновления Dreamweaver 8.0.2.
Решение. Обновите поведения сервера.
Когда вы позволяете строке запроса передавать параметр, убедитесь в том, что передается только ожидаемая информация. Компания Adobe разработала Средство обновления Dreamweaver 8.0.2, которое снижает риск атак с внедрением SQL-кода. Решения, примененные в нем, встроены во все последующие версии Dreamweaver. После обновления Dreamweaver 8 необходимо повторное применение поведения сервера к страницам, использующим их, и последующее повторное развертывание этих страниц на сервере.
В оставшейся части документа описано ручное редактирование кода Dreamweaver MX 2004 для предотвращения атак с внедрением SQL-кода с моделью сервера ColdFusion. Поведения сервера, уязвимые к таким атакам, перечислены ниже вместе с решениями проблемы:
- Набор записей с фильтром
- Поведение сервера «Вставить запись» и мастер формы вставки записи
- Поведение сервера «Обновить запись» и мастер формы обновления записи
- Поведение сервера «Удалить запись»
- Поведение сервера «Вход пользователя в систему»
- Поведение сервера «Проверить новое имя пользователя»
- Основной набор страниц сведений
Набор записей с фильтром
Наборы записей без фильтрации не требуется изменять, в отличие от наборов с фильтром. В приведенном ниже примере набор записей Dreamweaver MX 2004 «Recordset1» фильтруется по значению ID, передаваемому из параметра URL. Требуется изменить выделенный ниже код.
<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =#URL.COMMENT_ID#</cfquery>
Для защиты набора записей от атак с внедрением SQL-кода используйте тег cfqueryparam в теге cfquery, который содержит оператор SQL SELECT. Тег cfqueryparam будет проверять тип данных параметра запроса и поможет защитить базы данных от неавторизованных пользователей. Строка, выделенная желтым — это измененный, безопасный код.
<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>
Поведения сервера типа «Вставить запись» и мастер формы вставки записи
Для защиты набора записей от атак с внедрением SQL-кода используйте тег cfqueryparam в теге cfquery, который содержит оператор SQL INSERT. Тег cfqueryparam будет проверять тип данных параметра запроса и поможет защитить базы данных от неавторизованных пользователей.
Исходный код. Требуется изменить выделенный ниже код:
<cfquery datasource="cafetownsend"> INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE) VALUES (<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ "">'#FORM.textfield1#'<cfelse>NULL</cfif> ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ "">'#FORM.textfield2#'<cfelse>NULL</cfif> ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ "">'#FORM.textfield3#'<cfelse>NULL</cfif> )</cfquery>
Измененный, безопасный код:
<cfquery datasource="cafetownsend"> INSERT INTO COMMENTS (FIRST_NAME, LAST_NAME, TELEPHONE) VALUES<cfif IsDefined("FORM.textfield1") AND #FORM.textfield1# NEQ ""><cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif> ,<cfif IsDefined("FORM.textfield2") AND #FORM.textfield2# NEQ ""><cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"><cfelse>''</cfif> ,<cfif IsDefined("FORM.textfield3") AND #FORM.textfield3# NEQ ""><cfqueryparam value="#FORM.textfield3#" cfsqltype="cf_sql_clob" maxlength="20"><cfelse>''</cfif> )</cfquery>
Примечание. Выбирайте значения cfslqtype и maxlength, подходящие вашим данным.
Поведение сервера «Обновить запись» и Мастер формы обновления записи
Поведение сервера «Обновить запись» и Мастер формы обновления записи требуют комбинации описанных выше решений. Вначале найдите тег cfquery, содержащий оператор SQL SELECT, и измените его так, как описано в разделе Набор записей с фильтром. После этого найдите тег cfquery, содержащий оператор SQL UPDATE, и измените его так, как описано в разделе Поведения сервера типа «Вставить запись» и мастер формы вставки записи.
Поведение сервера «Удалить запись»
Изменения, которые необходимо внести в поведение сервера «Удалить запись», аналогичны изменениям для поведения Набор записей с фильтром.
Исходный код:
<cfquery datasource="cafetownsend"> DELETE FROM COMMENTS WHERE COMMENT_ID=#URL.COMMENT_ID#</cfquery>
Измененный, безопасный код:
<cfquery datasource="cafetownsend"> DELETE FROM COMMENTS WHERE COMMENT_ID=<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>
Примечание. Выбирайте значения cfslqtype и maxlength, подходящие вашим данным.
Поведение сервера «Вход пользователя в систему»
Для исправления кода поведения сервера «Вход пользователя в систему» найдите теги cfquery и добавьте теги cfqueryparam.
Исходный код:
<cfquery name="MM_rsUser" datasource="cafetownsend"> SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME='#FORM.textfield1#' AND LAST_NAME='#FORM.textfield2#'</cfquery>
Измененный, безопасный код:
<cfquery name="MM_rsUser" datasource="cafetownsend"> SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME=<cfqueryparam value="#FORM.textfield1#" cfsqltype="cf_sql_clob" maxlength="50"> AND LAST_NAME=<cfqueryparam value="#FORM.textfield2#" cfsqltype="cf_sql_clob" maxlength="50"></cfquery>
Примечание. Выбирайте значения cfslqtype и maxlength, подходящие вашим данным.
Поведение сервера «Проверить новое имя пользователя»
Поведение сервера «Проверить новое имя пользователя» требует, чтобы вначале на страницу было добавлено поведение «Вставить запись». Вначале найдите тег cfquery, содержащий оператор SQL SELECT, и измените его так, как описано в разделе Набор записей с фильтром. После этого найдите тег cfquery, содержащий оператор SQL INSERT, и измените его так, как описано в разделе Поведения сервера типа «Вставить запись» и мастер формы вставки записи.
Основной набор страниц сведений
Для объекта приложения «Основной набор страниц сведений» изменения касаются в основном набора записей, которые Dreamweaver создает для страницы сведений. Если на главной странице нет фильтруемого набора записей, то никаких изменений в главную страницу вносить не нужно. Если на главной странице находится фильтруемый набор записи, обратитесь к разделу Набор записей с фильтром и обновите код набора записи.
Для страницы сведений найдите тег cfquery, содержащий оператор SQL SELECT, и измените его так, как описано в разделе Набор записей с фильтром.
Дополнительная информация
Компания Adobe рекомендует использовать тег cfqueryparam с каждым тегом cfquery, чтобы усилить защиту баз данных от неавторизованных пользователей. Дополнительная информация об приведена по ссылке:
- Усиление безопасности с помощью тега cfqueryparam
- Бюллетень по безопасности Adobe: APSB 06-07 Уязвимость поведения сервера Dreamweaver к внедрению SQL-кода