我可以在CF11中获得强大的XSS保护吗?我可以在不接触每个查询或输入的情况下将其应用于整个网站

Can I get robust XSS protection in CF11 that I can apply to an entire site without touching every query or input?

本文关键字:我可以 输入 查询 网站 应用于 情况下 CF11 保护 XSS 接触      更新时间:2023-09-26

所以我目前使用的是CF11和CFWheels 1.1,"全局脚本保护"(GSP)服务器功能在覆盖XSS基础方面做得很糟糕。我想扩展它以阻止JS的任何和所有标签/矢量插入数据库。

CF11通过getSafeHTML()函数提供反Samy保护,该函数应用application.cfc中指定的xml策略文件,但我仍然需要修改应用程序中的每个varchar cfqueryparam才能使用它,对吗?

有没有一种方法可以让CF11以类似于GSP功能的方式在服务器或应用程序范围内启用反作弊功能?我的意思是,GSP自动从提交给应用程序的输入中删除标签,而无需修改所有查询/表单操作。我想用同样的方法应用反作弊策略文件或getSafeHTML()。

谢谢!

为什么必须将其应用于每一个?您只需要对字符串(varchar)输入执行此操作,并且仅在插入时执行。即便如此,你也不会在任何地方使用它。例如,如果你问我的名字和简历,你没有理由想要html,甚至是"好"的html。所以我相信你已经使用了一些东西来转义所有的html或者简单地将其全部删除。只有像bio这样的字段才会使用getSafeHTML。

验证就是工作。你(通常)不想要一个"一次性"的解决方案。只要咬紧牙关就行了。

如果您确实想这样做,您可以使用onRequestStart自动处理表单和url范围中的所有键。这是由内存编写的,因此可能有拼写错误,但这里有一个例子:

function onRequestStart(string req) {
    for(var key in form) { form[key] = getSafeHTML(form[key]); }
    for(var key in url) { url[key] = getSafeHTML(url[key]); }
}

我同意Ray的观点,验证就是工作,也是非常重要的工作。如果你可以有一个服务器范围的设置,它将是一种通用的方式来适应所有情况。当你对特定字段进行自己的验证时,你可以真正缩小攻击范围。例如,假设您有一个包含三个字段的表单;姓名、信用卡号码、社会保险号码。对于一个服务器范围的设置,它需要足够通用,以允许所有三种类型的输入。通过您自己的验证,您可以对每个字段都非常具体,并且只允许使用特定的字符集;name-只允许字母字符和空格,信用卡号-只允许数字、空格、破折号,并且必须符合mod规则,社会保险号码-只允许3-2-4格式的数字和破折号。不允许有其他内容。

话虽如此,我只是想指出,"全球脚本保护"规则可以自定义。该设置通过将服务器配置中的cf_root/lib/neo-security.xml文件或JEE配置中的cf_root/WEB-INF/cfusion/lib/neo-security.xml文件中定义的正则表达式应用于变量值来工作。您可以通过修改CrossSiteScriptPatterns变量中的正则表达式来自定义ColdFusion替换的模式。

默认的正则表达式定义为:

<var name='CrossSiteScriptPatterns'>
    <struct type='coldfusion.server.ConfigMap'>
        <var name='&lt;'s*(object|embed|script|applet|meta)'>
            <string>&lt;InvalidTag</string>
        </var>
    </struct>
</var>

这意味着,默认情况下,全局脚本保护机制只查找包含<object<embed<script<applet<meta的字符串,并用<InvalidTag替换它们。如果需要,可以增强该正则表达式以查找更多事例。

请参阅本页的"保护变量免受跨站点脚本攻击"部分

cfwheels 1.1应用程序实现的解决方案:

我使用了来自的slashdot文件https://code.google.com/p/owaspantisamy/downloads/list

这在应用程序中进行。fc:

<cfcomponent output="false">
    <cfset this.security.antisamypolicy="antisamy-slashdot-1.4.4.xml">      
    <cfinclude template="wheels/functions.cfm">     
</cfcomponent>

这在/ProjectRoot/events/onrequeststart.cfm文件中

    function xssProtection(){
var CFversion = ListToArray(SERVER.ColdFusion.productversion);
if(CFversion[1]GTE 11){
    for(var key in form) {
        if(not IsJSON(form[key])){
            form[key] = getSafeHTML(form[key]);
        }
    }
    for(var key in url) {
        if(not IsJSON(url[key])){
            url[key] = getSafeHTML(url[key]);
        }
    }
}

}xssProtection();

相关文章: