4

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

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

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

谢谢!

4

3 回答 3

8

为什么你要把它应用到每个人身上?您只需对字符串 (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]); }
}
于 2014-09-25T10:33:00.047 回答
2

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

话虽如此,我只想指出“全局脚本保护”规则可以自定义。该设置通过将cf_root/lib/neo-security.xml在服务器配置中的文件或cf_root/WEB-INF/cfusion/lib/neo-security.xmlJEE 配置中的文件中定义的正则表达式应用于变量值来工作。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>

这意味着,默认情况下,全局脚本保护机制仅查找包含<objector<embed<scriptor <appletor的字符串<meta并将其替换为<InvalidTag. 如果需要,您可以增强该正则表达式以查找更多情况。

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

于 2014-09-25T12:17:01.767 回答
0

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

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

这在 application.cfc 中:

<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();

于 2014-09-25T21:44:59.560 回答