Javascript 我可以在CF11中获得健壮的XSS保护,这样我就可以应用于整个站点,而不必涉及每个查询或输入吗?

Javascript 我可以在CF11中获得健壮的XSS保护,这样我就可以应用于整个站点,而不必涉及每个查询或输入吗?,javascript,coldfusion,xss,cfwheels,antisamy,Javascript,Coldfusion,Xss,Cfwheels,Antisamy,因此,我目前正在使用CF11和CF1.1,“全局脚本保护”(GSP)服务器功能在覆盖XSS基础方面做得非常糟糕。我想扩展它以阻止JS的任何和所有标记/向量被插入数据库 CF11通过getSafeTHTML()函数提供反艾米保护,该函数应用application.cfc中指定的xml策略文件,但我仍然需要修改应用程序中的每个varchar cfqueryparam以正确使用它 有没有办法让CF11以与GSP功能类似的方式在服务器或应用程序范围内启用反艾米功能?我的意思是,GSP自动从提交给应用程序

因此,我目前正在使用CF11和CF1.1,“全局脚本保护”(GSP)服务器功能在覆盖XSS基础方面做得非常糟糕。我想扩展它以阻止JS的任何和所有标记/向量被插入数据库

CF11通过getSafeTHTML()函数提供反艾米保护,该函数应用application.cfc中指定的xml策略文件,但我仍然需要修改应用程序中的每个varchar cfqueryparam以正确使用它

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


谢谢

为什么你要把它应用到每个人身上?您只需要对字符串(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的观点,验证是一项工作,也是一项非常重要的工作。如果您可以有一个服务器范围的设置,这将是一种适合所有情况的方法。当您对特定字段进行自己的验证时,您可以真正缩小攻击范围。例如,假设您有一个包含三个字段的表单;姓名、信用卡号码、社会保险号码。对于一个服务器范围的设置,它需要足够通用,以允许所有三种类型的输入。通过您自己的验证,您可以针对每个字段非常具体,并且只允许使用特定的字符集;姓名-仅允许字母字符和空格,信用卡号-仅允许数字、空格和破折号,并且必须符合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>

无效标签

这意味着,默认情况下,全局脚本保护机制仅查找包含为cfwheels 1.1应用程序实现的解决方案的字符串:

我使用了来自的slashdot文件

这适用于application.cfc:

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

输出任何内容时,我倾向于使用以下函数之一,具体取决于我输出的内容:
h()
(CFWheels别名用于
HtmlEditFormat()
),
NumberFormat()
DateFormat()
。我意识到这并不能解决垃圾输入垃圾输出的问题,但您应该在视图模板中小心转义HTML(当然,当您想要输出HTML时除外).这个答案可能还有另一种可能性--CFlib.org上有一个UDF,它检查一个值以确定它是否是xss。应用程序中有数千个varchar输入。我真的不想在每个领域都这样做。实际上,我们根本没有转义html。关键是这个应用程序非常庞大,而且它不是我要锁定以防止XSS的唯一应用程序。我为之工作的组织也有几十个类似的应用程序。转到组织中的每个varchar输入字段并应用新的验证规则是不可行的。您不是在转义html吗?那么,对于所有这些成千上万的字段,您确实需要html吗?这似乎不太可能。但是,从理论上讲,您可以将表单和URL范围视为一个结构,在每个字段上循环,并在每个字段上运行getSafeHTML。您可以在onRequestStart中执行此操作。我不建议这样做。我建议做艰苦的工作。但是,这将为您实现自动化。在我们的一个应用程序中,是的,我们确实需要HTML,因为它涉及一些CMS功能。在这个特定的应用程序中,不应该有HTML/标签进入数据库,但目前我们还不能防止标签进入数据库。onRequestStart选项听起来很不错。在表单变量上循环,然后在运行时应用GetSafeTHtml在URL参数上循环。要么就是这样,要么将其实现为一个wheels插件,只需在param结构上执行一个循环,但这将无法移植到我们的其他应用程序中。编辑您的答案以包含onRequestStart建议,如果您提供了一个小示例,我将投票/标记它作为解决方案。再次感谢。我才意识到你是谁。非常感谢你在这方面的意见!感谢您提供关于neo-security.xml的提示,这一定会奏效的。这个应用程序有数千个varchar输入字段,这不是我要锁定的唯一一个应用程序。
    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]);
        }
    }
}