2012-04-14 40 views
6

私のアプリケーションのセキュリティを改善しようとしています。整数であると思われるユーザーからのデータ(POSTまたはGETを問わず)を受け取るたびに、私はそれを適切に検証します。しかし、しばしばデータはVARCHARであり、時にはHTMLを含むこともあります。ColdFusionでのSQLインジェクションからの保護

この場合、DBをSQLインジェクションから保護するにはどうすればよいですか?

<cfqueryparam value="#form.textInput#" cfsqltype="cf_sql_varchar">は、VARCHAR値の中に悪意のあるSQL文を送信しないようにクエリを保護しますか?

答えて

5

あなたの質問に対する短い答えは「はい」です。

私は、3つの方法を使用してハッキングの試行をブロックします。

  1. 私はすべてのデータベースクエリでcfqueryparamを使用しています。私は、テンプレート/ cfmファイルの先頭にあるcfparamをURLスコープ変数に使用します。

  2. 私はPortcullisまたはその変形を使用しています。 http://portcullis.riaforge.org/から入手できます。 Portcullisは、いくつかのクロスサイトスクリプティング攻撃に対しても防御します。

  3. 私はWindows IIS 7.5(Windows Server 2008 R2)を使用しています。 URLリライト機能を使用して、URLベースの攻撃の大部分をブロックします。 Apacheとそれがサポートしているリライトでも同様のことができます。ここに私のIISのURL書き換えルールは以下のとおりです。

    <?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> 
    

これらの規則はCに追加されます。IISの\ Windowsの\ system32 \ inetsrv \ config \にあるapplicationHost.configファイル。しかし、私は**** NOT ****このファイルを直接編集することをお勧めします。 1つの間違いとIISが読み込まれません。代わりに、&を上記のルールを貼り付けて、 "iis-global-rewrite.xml"として保存します。次に、あなたのIISサーバーにルールを追加するには、次のバッチファイルを実行します。

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

IISの書き換えルールは、IIS 7.0(Windows Server 2008の)で動作するはずですが、私はそれをテストしていません。

これらのルールは、サーバーにアクセスできない場合はweb.configファイルを使用して1つのサイトに適用することもできます。

なぜ3つの異なる方法を使用して保護しますか?それらのどれもがすべての拠点を網羅していないからです。 IISの書き換えルールは、URLベースの攻撃に対してのみ保護します。ハッカーは同じことを行うフォーム提出攻撃を使用することもできます。私は、PHP、ASPなどのサーバー上のすべてのサイトで動作するため、最初の保護ラインとしてIISルールを好む.Portcullisは、フォームベースの攻撃とクロスサイトスクリプティングを捕捉するため、ColdFusionの第2の優れた防衛線である攻撃。最後の防衛線は、URL /フォームベースのSQLインジェクション攻撃から保護するcfqueryparam/cfparamコードです。

これら3つの方法をすべて使用する場合、サーバー/サイトは非常に安全です。私は、攻撃が進化し改善するにつれて、時々サーバーログを見直すようアドバイスします。

+1

うわー、それはちょうど完璧です。私は実際にIIS上でCFを実行していますので、私は間違いなく、より高度な書き換えルールを使ってWebアプリケーションを保護します。ありがとう! – Eleeist

+0

IIS URLリライトとApache mod_rewriteは、防衛やSEOのための非常に便利なツールです。 http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspxには、IIS URL書き換えの便利な例がいくつかあります。 –

6

短い答えは「はい」です。

cfqueryparamは、いくつかのSQLインジェクション攻撃の発生を停止します。

他にも攻撃変数がありますので注意してください。しかし、十分に書かれたcoldfusionは非常に安全です。

入力HTMLを保存して後で表示する場合は、クロスサイトスクリプティング攻撃に注意してください。特にjavascriptタグに注意してください。

+0

ありがとうございます!それは本当に役に立ちました。 – Eleeist

+3

cfqueryparamがSQLインジェクション攻撃を停止しない*唯一の時間は、攻撃の性質とは関係ありませんが、データベース上のコードの性質です。たとえば、varchar引数をとり、それをSQLとして動的に実行するデータベースプロシージャを呼び出す場合、パラメータ化されたクエリは必要ありません。 CfQueryParamは、プレーンSQL(データベースプロシージャコールなどなし)を使用している場合、SQLインジェクション攻撃を常に*防止します。 –

+1

適切であれば、可変長のテキストフィールドにも 'maxlength'を使うのを忘れないでください。たとえば、テキストフィールドの長さが最大16文字の文字列しかないことがわかっている場合は、長い文字列をエラーとしてフラグする必要がありません。 –

関連する問題