在ColdFusion中防止SQL注入

在ColdFusion中防止SQL注入,sql,coldfusion,code-injection,cfqueryparam,Sql,Coldfusion,Code Injection,Cfqueryparam,我正在努力提高我的应用程序的安全性。每当我从用户(无论是通过POST还是GET)接收到应该是整数的数据时,我都会适当地验证它。但数据通常是VARCHAR,有时可能包含HTML 在这种情况下,如何保护数据库不受SQL注入的影响 是否保护查询不在VARCHAR值内发送恶意SQL语句?简短的回答是肯定的 cfqueryparam将阻止某些sql注入攻击的发生 还有其他攻击变量可以使用,所以要小心,但是编写良好的coldfusion是非常安全的 如果您正在存储并稍后显示输入html,请小心跨站点脚本攻击

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

在这种情况下,如何保护数据库不受SQL注入的影响


是否保护查询不在VARCHAR值内发送恶意SQL语句?

简短的回答是肯定的

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

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


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

您的问题的简短答案是“是”

我用三种方法阻止黑客尝试

  • 我在所有数据库查询中都使用cfqueryparam。对于url范围变量,我将在模板/cfm文件的顶部使用cfparam

  • 我使用过Portcullis或其变体。你可以从我这里得到它。Portcullis还将防御一些跨站点脚本攻击

  • 我使用WindowsIIS7.5(WindowsServer2008R2)。我使用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文件中。但是我不****不****建议您直接编辑此文件。一个错误,IIS将无法加载。而是复制并粘贴上面的规则,并将其保存为“iis global rewrite.xml”。然后运行以下批处理文件将规则添加到IIS服务器:

    C:\Windows\System32\inetsrv\appcmd.exe set config -in < iis-global-rewrite.xml
    
    C:\Windows\System32\inetsrv\appcmd.exe set config-in
    IIS重写规则应适用于IIS 7.0(Windows Server 2008),但我尚未对其进行测试

    如果您没有访问服务器的权限,这些规则也可以应用于使用web.config文件的单个站点

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


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

    谢谢!这真的很有帮助。cfqueryparam唯一不会停止SQL注入攻击的时间与攻击的性质无关,而是与数据库上代码的性质有关。例如,如果要调用某个接受varchar参数的数据库过程,并将其作为SQL动态运行,那么再多的参数化查询都不会对您有所帮助。CfQueryParam在使用纯SQL(无数据库过程调用等)时将始终防止SQL注入攻击。在适当的情况下,不要忘记在可变长度文本字段上使用
    maxlength
    。例如,如果您知道一个文本字段最多只有16个字符的字符串,那么就不需要允许输入更长的字符串,因为它们应该被标记为错误。哇,这太完美了。我实际上是在IIS上运行CF,所以我肯定会考虑使用一些更高级的重写规则来保护我的web应用程序。谢谢IIS URL重写和Apache mod_重写对于防御和SEO来说是非常有用的工具。有一些关于IIS URL重写的有用示例。