2012-04-14 14 views
6

Sto cercando di migliorare la sicurezza dell'applicazione. Ogni volta che ricevo dati dall'utente (tramite POST o GET) che si suppone siano un numero intero, lo convalido in modo appropriato. Ma spesso i dati sono VARCHAR e talvolta possono contenere HTML.Protezione dall'iniezione SQL in ColdFusion

In che modo proteggi il mio DB dall'iniezione SQL in questo caso?

<cfqueryparam value="#form.textInput#" cfsqltype="cf_sql_varchar"> protegge la query dall'invio di un'istruzione SQL dannosa all'interno di un valore VARCHAR?

risposta

5

La risposta breve alla tua domanda è "sì".

I blocco dei tentativi di hacking tramite tre metodi.

  1. Io uso cfqueryparam in tutte le mie query di database. Userò cfparam nella parte superiore dei file template/cfm per le variabili dell'URL.

  2. Ho usato Portcullis o varianti di esso. Puoi ottenerlo dal http://portcullis.riaforge.org/. La saracinesca difenderà anche da alcuni attacchi cross-site scripting.

  3. Uso Windows IIS 7.5 (Windows Server 2008 R2). Uso la funzione di riscrittura degli URL per bloccare la maggior parte degli attacchi basati su URL. Puoi fare cose simili con Apache e la riscrittura che supporta. Qui sono le mie regole di riscrittura 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> 
    

Queste regole vengono aggiunti alla cartella C: inetsrv \ config \ applicationHost.config file \ Windows \ System32 \ per IIS. Comunque io **** NON **** consiglio di modificare direttamente questo file. Un errore e IIS non verrà caricato. Invece copia & incollare le regole sopra e salvarle come "iis-global-rewrite.xml". Quindi eseguire il seguente file batch per aggiungere le regole per il server IIS: regole di riscrittura

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

L'IIS dovrebbero funzionare con IIS 7.0 (Windows Server 2008), ma non l'ho testato.

Queste regole possono anche essere applicate a un singolo sito utilizzando il file web.config se non si ha accesso al server.

Perché utilizzo tre metodi diversi per la protezione? Perché nessuno di loro copre tutte le basi. Le regole di riscrittura di IIS proteggono solo dagli attacchi basati su URL. Gli hacker possono anche utilizzare gli attacchi di sottomissione dei moduli che fanno la stessa cosa. Preferisco le regole di IIS come prima linea di protezione perché funzionerà con tutti i siti sul server, inclusi PHP, ASP, ecc. Portcullis è una buona seconda linea di difesa per ColdFusion perché cattura gli attacchi basati su moduli e alcuni script cross-site attacchi. L'ultima linea di difesa è il codice cfqueryparam/cfparam che protegge dagli attacchi di iniezione SQL basati su URL/moduli.

Se tutti e tre questi metodi sono utilizzati, il server/sito dovrebbe essere molto sicuro. Vorrei ancora consigliare di rivedere i log del server di volta in volta, mentre gli attacchi si evolvono e migliorano.

+1

Wow, è semplicemente perfetto. In realtà sto eseguendo CF su IIS, quindi cercherò sicuramente di rendere sicura la mia app web con alcune regole di riscrittura più avanzate. Grazie! – Eleeist

+0

URL IIS Rewrite e Apache mod_rewrite sono strumenti molto utili per difesa e SEO. http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx ha alcuni esempi utili per IIS URL Rewrite. –

6

La risposta breve è sì.

cfqueryparam interromperà alcuni attacchi di SQL injection.

Ci sono altre variabili di attacco che possono essere utilizzate, quindi fate attenzione, ma coldfusion ben scritto può essere molto sicuro.

Fare attenzione agli attacchi di cross site scripting se si memorizza e successivamente si visualizza l'input html, prestare particolare attenzione ai tag javascript.

+0

Grazie! E 'stato davvero d'aiuto. – Eleeist

+3

L'unica volta che cfqueryparam * non * interrompe un attacco di SQL injection non avrà nulla a che fare con la natura dell'attacco, ma con la natura del codice sul database. Ad esempio, se dovessi chiamare una procedura di database che ha preso un argomento varchar e lo ha eseguito dinamicamente come SQL, nessuna quantità di query parametrizzate ti aiuterà. CfQueryParam * preverrà * sempre gli attacchi di SQL injection quando si utilizza SQL semplice (nessuna chiamata alla procedura del database, ecc.). –

+1

Non dimenticare di usare 'maxlength' anche su campi di testo a lunghezza variabile, dove opportuno. Se sai che un campo di testo avrà solo stringhe lunghe fino a 16 caratteri, ad esempio, non è necessario consentire stringhe più lunghe in quanto dovrebbero essere contrassegnate come un errore. –