Zabezpieczenie serwera Dreamweaver ColdFusion przed atakami SQL injection.
Zagrożenie atakami SQL injection
Niektóre bazy danych umożliwiają wysyłanie wielu poleceń SQL w jednym zapytaniu. Kreuje to potencjalne zagrożenia bezpieczeństwa powstające podczas przekazywania parametrów w ciągu zapytania do generowanej dynamicznie kwerendy bazy danych. Hakerzy mogą próbować przechwycić i zmodyfikować adres URL lub dołączyć zmienne do zapytania dynamicznego ze złośliwymi poleceniami SQL. Taki atak często jest określany nazwą SQL injection. Niektóre elementy kodu zachowania serwera Dreamweaver można zmienić tak, aby zmniejszyć ryzyko ataków SQL injection. Więcej informacji na temat ataków SQL injection podano w tym artykule w Wikipedii.
Uwaga: Problem opisany w tym artykule usunięto w aktualizacji Dreamweaver 8.0.2 Updater.
Rozwiązanie: Aktualizacja zachowań serwerowych
Jeśli w ciągu zapytania jest przekazywany parametr, zadbaj o to, by przesyłane były jedynie oczekiwane informacje. Firma Adobe przygotowała aktualizację Dreamweaver 8.0.2 Updater, która zmniejsza ryzyko ataków SQL injection. Poprawki te zostały włączone do wszystkich kolejnych wydań programu Dreamweaver. Po aktualizacji programu Dreamweaver należy ponownie zastosować zasady zachowania serwera na używających go stronach, a następnie ponownie wdrożyć te strony na serwerze.
W dalszej części tego dokumentu opisano sposób ręcznej edycji kody Dreamweaver MX 2004 w celu ochrony przed atakami SQL injection z modelem serwera ColdFusion. Poniżej przedstawiono zachowania serwera podatne na te ataki wraz z poprawkami:
- Zestaw rekordów z filtrem
- Zachowanie serwera Wstawienie rekordu oraz Kreator formularza wstawiania rekordu
- Aktualizacja rekordu oraz Kreator formularza aktualizacji rekordu
- Zachowanie serwera Usunięcie rekordu
- Zachowanie serwera Zalogowanie użytkownika
- Zachowanie serwera Sprawdzenie nowego użytkownika
- Zestaw stron Dane podstawowe
Zestaw rekordów z filtrem
Niefiltrowane zestawy rekordów nie muszą być modyfikowane, ale filtrowane — tak. W poniższym przykładzie zestaw rekordów Dreamweaver MX 2004 o nazwie „Recordset1” jest filtrowany za pomocą identyfikatora przekazywanego z parametru URL. Elementem wymagającym zmiany jest wyróżniony poniżej kod:
<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =#URL.COMMENT_ID#</cfquery>
Aby zabezpieczyć zestaw rekordów przed atakami SQL injection, w znaczniku cfquery zawierającym polecenie SQL SELECT użyj znacznika cfqueryparam. Znacznik cfqueryparam zweryfikuje typ danych parametru zapytania i umożliwi zabezpieczenie baz danych przed nieautoryzowanymi użytkownikami. Wiersz wyróżniony na żółto to zmodyfikowany kod zabezpieczający:
<cfquery name="Recordset1" datasource="cafetownsend"> SELECT * FROM COMMENTS WHERE COMMENT_ID =<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>
Zachowanie serwera Wstawienie rekordu oraz Kreator formularza wstawiania rekordu
Aby zabezpieczyć zestaw rekordów przed atakami SQL injection, w znaczniku cfquery zawierającym polecenie SQL INSERT użyj znacznika cfqueryparam. Znacznik cfqueryparam zweryfikuje typ danych parametru zapytania i umożliwi zabezpieczenie baz danych przed nieautoryzowanymi użytkownikami.
Kod oryginalny. Elementem wymagającym zmiany jest wyróżniony poniżej kod:
<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>
Zmodyfikowany kod zabezpieczający:
<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>
Uwaga: Wybierz odpowiednie wartości cfslqtype oraz maxlength dla wykorzystywanych danych.
Aktualizacja rekordu oraz Kreator formularza aktualizacji rekordu
Zachowanie serwera Aktualizacja rekordu oraz kreator formularza aktualizacji rekordu wymagają kombinacji powyższych rozwiązań. Najpierw znajdź znacznik cfquery zawierający polecenie SQL SELECT i zmodyfikuj go w sposób opisany dla zestawu rekordów z filtrem. Następnie znajdź znacznik cfquery zawierający polecenie SQL UPDATE i zmodyfikuj go w sposób opisany dla Zachowanie serwera Wstawienie rekordu oraz Kreator formularza wstawiania rekordu.
Zachowanie serwera Usunięcie rekordu
Modyfikacja zachowania serwera Usunięcie rekordu jest podobna do modyfikacji dla opcji Zestaw rekordów z filtrem.
Kod oryginalny:
<cfquery datasource="cafetownsend"> DELETE FROM COMMENTS WHERE COMMENT_ID=#URL.COMMENT_ID#</cfquery>
Zmodyfikowany kod zabezpieczający:
<cfquery datasource="cafetownsend"> DELETE FROM COMMENTS WHERE COMMENT_ID=<cfqueryparam value="#URL.COMMENT_ID#" cfsqltype="cf_sql_numeric"></cfquery>
Uwaga: Wybierz odpowiednie wartości cfslqtype oraz maxlength dla wykorzystywanych danych.
Zachowanie serwera Zalogowanie użytkownika
Aby skorygować kod zachowania serwera Zalogowanie użytkownika, przejdź do znaczników cfquery i cfqueryparam.
Kod oryginalny:
<cfquery name="MM_rsUser" datasource="cafetownsend"> SELECT FIRST_NAME,LAST_NAME FROM COMMENTS WHERE FIRST_NAME='#FORM.textfield1#' AND LAST_NAME='#FORM.textfield2#'</cfquery>
Zmodyfikowany kod zabezpieczający:
<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>
Uwaga: Wybierz odpowiednie wartości cfslqtype oraz maxlength dla wykorzystywanych danych.
Zachowanie serwera Sprawdzenie nowego użytkownika
Zachowanie serwera Sprawdzenie nowego użytkownika wymaga, aby najpierw dodać do strony zachowanie serwera Wstawienie rekordu. Najpierw znajdź znacznik cfquery zawierający polecenie SQL SELECT i zmodyfikuj go w sposób opisany dla zestawu rekordów z filtrem. Następnie znajdź znacznik cfquery zawierający polecenie SQL INSERT i zmodyfikuj go w sposób opisany dla Zachowanie serwera Wstawienie rekordu oraz Kreator formularza wstawiania rekordu.
Zestaw stron Dane podstawowe
W obiekcie aplikacji Zestaw stron Dane podstawowe zmiany dotyczą głównie zestawu rekordów tworzonego przez program Dreamweaver dla strony ze szczegółami. Jeśli nie na stronie podstawowej nie ma odfiltrowanego zestawu rekordów, nie muszą być na niej wprowadzane żadne zmiany. Jeśli nie na stronie podstawowej występuje odfiltrowany zestaw rekordów, zaktualizuj kod zestawu rekordów zgodnie z opisem w sekcji Zestaw rekordów z filtrem.
Na stronie ze szczegółami znajdź znacznik cfquery zawierający polecenie SQL SELECT i zmodyfikuj go w sposób opisany dla zestawu rekordów z filtrem.
Dodatkowe informacje
Adobe zaleca używanie znacznika cfqueryparam w każdym znaczniku cfquery. Pozwoli to na zabezpieczenie baz danych przed nieautoryzowanymi użytkownikami. Więcej informacji można znaleźć w sekcji:
- Zwiększanie bezpieczeństwa znacznikiem cfqueryparam
- Biuletyn zabezpieczeń Adobe: APSB 06-07 Podatność serwera Dreamweaver na atak SQL Injection