6

我正在尝试提高我的应用程序的安全性。每当我从用户(无论是通过 POST 还是通过 GET)接收到应该是整数的数据时,我都会适当地验证它。但通常数据是 VARCHAR,有时可以包含 HTML。

在这种情况下,如何保护我的数据库免受 SQL 注入?

是否 <cfqueryparam value="#form.textInput#" cfsqltype="cf_sql_varchar">保护查询免于在 VARCHAR 值内发送恶意 SQL 语句?

4

2 回答 2

6

简短的回答是肯定的。

cfqueryparam 将阻止某些 sql 注入攻击的发生。

还有其他可以使用的攻击变量,所以要小心,但是写得好的coldfusion可以非常安全。

如果您正在存储并稍后显示输入 html,请注意跨站点脚本攻击,尤其要小心 javascript 标记。

于 2012-04-14T10:33:37.977 回答
5

您的问题的简短回答是“是”。

我使用三种方法阻止黑客攻击。

  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>
    

这些规则被添加到 IIS 的 C:\Windows\System32\inetsrv\config\applicationHost.config 文件中。但是,我 ****NOT**** 建议您直接编辑此文件。一个错误,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 文件将这些规则应用于单个站点。

为什么我使用三种不同的保护方法?因为它们都没有覆盖所有的基础。IIS 重写规则只能防止基于 URL 的攻击。黑客也可以使用做同样事情的表单提交攻击。我更喜欢将 IIS 规则作为第一道防线,因为它适用于服务器上的所有站点,包括 PHP、ASP 等。Portcullis 是 ColdFusion 的第二道防线,因为它可以捕获基于表单的攻击和一些跨站点脚本攻击。最后一道防线是 cfqueryparam/cfparam 代码,它可以防止基于 URL/表单的 SQL 注入攻击。

如果使用所有这三种方法,则服务器/站点应该非常安全。随着攻击的发展和改进,我仍然建议不时查看服务器日志。

于 2012-04-15T02:48:37.850 回答