6

アプリケーションのセキュリティを向上させようとしています。整数であると思われるデータをユーザーから(POSTまたはGETを介して)受信するたびに、それを適切に検証します。ただし、多くの場合、データはVARCHARであり、HTMLを含む場合もあります。

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

<cfqueryparam value="#form.textInput#" cfsqltype="cf_sql_varchar">VARCHAR値内に悪意のあるSQLステートメントを送信することからクエリを保護しますか?

4

2 に答える 2

6

短い答えはイエスです。

cfqueryparam は、一部の SQL インジェクション攻撃の発生を阻止します。

使用できる攻撃変数は他にもあるので注意が必要ですが、適切に記述されたコールドフュージョンは非常に安全です。

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

于 2012-04-14T10:33:37.977 に答える
5

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

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

  1. すべてのデータベースクエリでcfqueryparamを使用しています。urlスコープ変数のtemplate/cfmファイルの上部にあるcfparamを使用します。

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

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

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

これらのルールは、IISのC:\ Windows \ System32 \ inetsrv \ config\applicationHost.configファイルに追加されます。ただし、このファイルを直接編集することは****しない****ことをお勧めします。1つの間違いとIISはロードされません。代わりに、上記のルールをコピーして貼り付け、「iis-global-rewrite.xml」として保存してください。次に、次のバッチファイルを実行して、IISサーバーにルールを追加します。

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

IISの書き換えルールはIIS7.0(Windows Server 2008)で機能するはずですが、テストしていません。

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

保護に3つの異なる方法を使用するのはなぜですか?それらのどれもがすべての拠点をカバーしていないからです。IISの書き換えルールは、URLベースの攻撃からのみ保護します。ハッカーは、同じことを行うフォーム送信攻撃を使用することもできます。PHP、ASPなどを含むサーバー上のすべてのサイトで機能するため、IISルールを最初の保護ラインとして使用します。Portcullisは、フォームベースの攻撃やクロスサイトスクリプティングをキャッチするため、ColdFusionの優れた2番目の防御ラインです。攻撃。最後の防御線は、URL/フォームベースのSQLインジェクション攻撃から保護するcfqueryparam/cfparamコードです。

これらの3つの方法すべてを使用する場合、サーバー/サイトは非常に安全である必要があります。攻撃が進化して改善するので、サーバーログを時々確認することをお勧めします。

于 2012-04-15T02:48:37.850 に答える