2012-04-14 15 views
6

Próbuję poprawić bezpieczeństwo mojej aplikacji. Ilekroć otrzymuję dane od użytkownika (przez POST lub GET), które mają być liczbą całkowitą, poprawiam to odpowiednio. Ale często dane to VARCHAR, a czasami mogą zawierać HTML.Ochrona przed iniekcją SQL w ColdFusion

W jaki sposób mogę zabezpieczyć mój DB przed iniekcją SQL?

Czy chroni zapytanie przed wysłaniem złośliwej instrukcji SQL wewnątrz wartości VARCHAR?

Odpowiedz

5

Krótka odpowiedź na twoje pytanie brzmi "tak".

Blokuję próby włamań za pomocą trzech metod.

  1. Używam cfqueryparam we wszystkich zapytaniach do bazy danych. Będę używał cfparam na szczycie plików template/cfm dla zmiennych zakresu URL.

  2. Użyłem Portcullis lub jego wariantów. Możesz go uzyskać od http://portcullis.riaforge.org/. Portcullis będzie także bronić się przed atakami typu cross-site scripting.

  3. Używam Windows IIS 7.5 (Windows Server 2008 R2). Używam funkcji URL Rewrite, aby zablokować większość ataków opartych na adresach URL. Możesz robić podobne rzeczy z Apache i przepisywaną przez niego obsługą. Oto moje reguły przepisywania URL IIS:

    <?xml version="1.0" encoding="UTF-8"?> 
    <appcmd> 
        <CONFIG CONFIG.SECTION="system.webServer/rewrite/globalRules" path="MACHINE/WEBROOT/APPHOST" overrideMode="Inherit" locked="false"> 
         <system.webServer-rewrite-globalRules> 
          <rule name="SQL Injection - EXEC - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*EXEC\s*[\(|%28].*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - EXEC - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*EXEC\s*[\(|%28].*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - CAST - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*CAST\s*[\(|%28].*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - CAST - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*CAST\s*[\(|%28].*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - DECLARE - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*DECLARE.*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - DECLARE - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*DECLARE.*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - NVARCHAR - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*CHAR\s*[\(|%28].*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - NVARCHAR - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*CHAR\s*[\(|%28].*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - sp_password - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*sp_password.*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - sp_password - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*sp_password.*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - xp - SCRIPT_NAME" stopProcessing="true"> 
           <match url="^.*%20xp_.*$" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
          <rule name="SQL Injection - xp - QS" stopProcessing="true"> 
           <match url=".*" /> 
           <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
            <add input="{QUERY_STRING}" pattern="^.*%20xp_.*$" /> 
           </conditions> 
           <serverVariables> 
           </serverVariables> 
           <action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" /> 
          </rule> 
         </system.webServer-rewrite-globalRules> 
        </CONFIG> 
    </appcmd> 
    

Przepisy te są dodawane do katalogu C: \ Windows \ System32 \ inetsrv \ config \ applicationHost.config plik dla IIS. Jednak robię **** NOT **** zalecam, aby bezpośrednio edytować ten plik. Jeden błąd i IIS nie zostaną załadowane. Zamiast tego skopiuj & i wklej powyższe reguły i zapisz je jako "iis-global-rewrite.xml". Następnie uruchom następujące plik wsadowy, aby dodać reguły do ​​serwera IIS: Reguły przepisywania

C:\Windows\System32\inetsrv\appcmd.exe set config -in < iis-global-rewrite.xml 

IIS powinien pracować z IIS 7.0 (Windows Server 2008), ale ja jej nie testowane.

Te reguły można również zastosować do pojedynczej witryny za pomocą pliku web.config, jeśli nie masz dostępu do serwera.

Dlaczego używam trzech różnych metod ochrony? Ponieważ żaden z nich nie obejmuje wszystkich baz. Zasady przepisywania IIS chronią tylko przed atakami opartymi na adresach URL. Hakerzy mogą również używać ataków polegających na przesyłaniu formularzy, które robią to samo. Wolę reguły IIS jako pierwszą linię ochrony, ponieważ będzie działać ze wszystkimi lokacjami na serwerze, w tym PHP, ASP, itp. Portcullis jest dobrą drugą linią obrony dla ColdFusion, ponieważ będzie przechwytywał ataki oparte na formularzach i niektóre skrypty cross site ataki. Ostatnią linią obrony jest kod cfqueryparam/cfparam, który chroni przed atakami typu SQL injection opartymi na adresie URL/formularzu.

Jeśli wszystkie trzy z tych metod są używane serwer/witryna powinna być bardzo bezpieczna. Nadal zalecałbym przeglądanie dzienników serwera od czasu do czasu, gdy ataki będą ewoluować i ulepszać się.

+1

Wow, to jest po prostu idealne. W rzeczywistości używam CF w IIS, więc na pewno zajrzę do zabezpieczenia mojej aplikacji internetowej za pomocą bardziej zaawansowanych reguł przepisywania. Dzięki! – Eleeist

+0

Internetowe przepychanki w IIS i Apache mod_rewrite są bardzo przydatnymi narzędziami do obrony i SEO. http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx zawiera kilka przydatnych przykładów na przeprogramowanie URL-a IIS. –

6

Krótka odpowiedź brzmi tak.

cfqueryparam zatrzyma niektóre ataki typu sql injection.

Istnieją inne zmienne ataku, które można wykorzystać, więc bądź ostrożny, ale dobrze napisane coldfusion może być bardzo bezpieczne.

Uważaj na ataki z użyciem skryptów krzyżowych, jeśli przechowujesz i wyświetlasz wejściowy html, zwracaj szczególną uwagę na tagi javascript.

+0

Dzięki! To było naprawdę pomocne. – Eleeist

+3

Jedyny przypadek, w którym cfqueryparam * nie * zatrzyma ataku SQL injection, nie będzie miał nic wspólnego z charakterem ataku, ale z naturą kodu w bazie danych. Na przykład, gdybyś zadzwonił do jakiejś procedury bazodanowej, która pobierała argument varchar i uruchamiała go dynamicznie jako SQL, nie pomoże ci żadna ilość sparametryzowanych zapytań. CfQueryParam * zawsze * zapobiegnie atakom SQL injection przy użyciu zwykłego kodu SQL (bez wywoływania procedur bazy danych itp.). –

+1

Nie zapomnij użyć "maxlength" również w polach tekstowych o zmiennej długości, jeśli są odpowiednie. Jeśli wiesz, że pole tekstowe ma tylko ciągi składające się z maksymalnie 16 znaków, na przykład, nie ma potrzeby, aby zezwolić na dłuższe łańcuchy, ponieważ powinny być oznaczone jako błąd. –

Powiązane problemy