Ele*_*ist 6 sql coldfusion cfqueryparam code-injection
我正在努力提高应用程序的安全性.每当我从用户(无论是通过POST还是GET)接收应该是整数的数据时,我都会适当地验证.但通常数据是VARCHAR,有时可以包含HTML.
在这种情况下,如何保护我的数据库免受SQL注入?
是否 <cfqueryparam value="#form.textInput#" cfsqltype="cf_sql_varchar">保护查询不在VARCHAR值中发送恶意SQL语句?
简短的回答是肯定的.
cfqueryparam将停止发生一些sql注入攻击.
还有其他可以使用的攻击变量,所以要小心,但写得好的coldfusion可以非常安全.
如果您要存储并稍后显示输入html,请注意跨站点脚本攻击,请特别注意javascript标记.
对你的问题的简短回答是'是'.
我使用三种方法阻止黑客攻击.
我在所有数据库查询中都使用cfqueryparam.我将在模板/ cfm文件的顶部使用cfparam作为url范围变量.
我使用过Portcullis或它的变种.你可以从http://portcullis.riaforge.org/获得它.Portcullis还将抵御一些跨站点脚本攻击.
我使用的是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>
Run Code Online (Sandbox Code Playgroud)这些规则将添加到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
Run Code Online (Sandbox Code Playgroud)
IIS重写规则应该适用于IIS 7.0(Windows Server 2008),但我还没有测试过.
如果您无权访问服务器,则可以使用web.config文件将这些规则应用于单个站点.
为什么我使用三种不同的保护方法?因为它们都不包括所有的基础.IIS重写规则仅防止基于URL的攻击.黑客也可以使用表单提交攻击来执行相同的操作.我更喜欢IIS规则作为第一道防线,因为它可以与服务器上的所有站点一起使用,包括PHP,ASP等.Portcullis是ColdFusion的第二道防线,因为它可以捕获基于表单的攻击和一些跨站点脚本攻击.最后一道防线是cfqueryparam/cfparam代码,它可以防止基于URL /表单的SQL注入攻击.
如果使用所有这三种方法,则服务器/站点应该非常安全.我仍然建议不时检查服务器日志,因为攻击会不断发展和改进.