因此,我目前正在使用CF11和CFWheels 1.1,“全局脚本保护”()服务器功能在涵盖XSS基础方面做得很糟糕。我想将其扩展到阻止JS的任何和所有标记/向量插入到数据库中。
CF11通过getSafeHTML()函数提供antiSamy保护,该函数应用application.cfc中指定的xml文件,但我仍然需要修改应用程序中的每个varchar才能使用它,对吗?
是否有一种方法可以使CF11以类似于GSP特性的方式启用反that特性服务器或应用程序?我的意思是,GSP自动从提交给应用程序的输入中删除标记,而不必修改所有查询/表单操作。我希望有一种方法来以同样的方式应用antisamy策略文件或getSafeHTML()。
谢谢!
发布于 2014-09-25 10:33:00
你为什么要把它应用到每个人身上?您只需要在字符串(varchar)输入和插入时这样做。即使如此,你也不会到处使用它。例如,如果你问我的名字和简历,你没有理由要html,甚至“好”html,在我的名字。因此,我确信您已经使用了一些东西来转义所有html或简单地删除它。只有在像生物这样的领域,你才会使用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-25 12:17:01
我同意Ray的观点,验证是工作,也是非常重要的工作。如果您可以有一个服务器范围的设置,这将是通用的方式,以适应所有情况。当您对特定字段进行自己的验证时,您确实可以缩小攻击面。例如,假设您有一个包含三个字段的表单:姓名、信用卡号码、社会保险号码。对于一个服务器范围的设置,它需要足够通用,允许所有三种类型的输入。通过您自己的验证,您可以对每个字段非常具体,并且只允许特定的一组字符;name -只允许alpha字符和空格,信用卡号码-只允许数字、空格、破折号,并且必须符合mod规则,社会保障号码-只允许数字和破折号3-2-4格式。其他的都不允许。
尽管如此,我只想指出,“全球脚本保护”规则可以定制。该设置通过将服务器配置中的cf_root/lib/neo-security.xml文件中定义的正则表达式或JEE配置中的cf_root/WEB-INF/cfusion/lib/neo-security.xml文件中定义的正则表达式应用到变量值中来工作。您可以通过修改ColdFusion变量中的正则表达式来自定义CrossSiteScriptPatterns替换的模式。
默认正则表达式定义为:
<var name='CrossSiteScriptPatterns'>
<struct type='coldfusion.server.ConfigMap'>
<var name='<\s*(object|embed|script|applet|meta)'>
<string><InvalidTag</string>
</var>
</struct>
</var>这意味着,默认情况下,全局脚本保护机制只查找包含<object或<embed或<script或<applet或<meta的字符串,并将其替换为<InvalidTag。如果需要,可以增强该正则表达式以查找更多的情况。
请参阅保护变量不受本页跨站点脚本攻击部分的影响。
发布于 2014-09-25 21:44:59
该解决方案是为cf轮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();
https://stackoverflow.com/questions/26029383
复制相似问题