我正在努力重做我们公司的代码,我希望有一个清晰,易读且相当安全的application.cfm。
不,我们没有使用application.cfc。所以,请不要讨论。
只想知道您为安全性添加哪些脚本。
我使用的是coldfusion 8标准,sql 2008。
这是我目前正在使用的一个脚本,但我想听听其他一些冷冻程序员的说法。
<cfset temp = cleanScopes('form,url') />
<!--- another method to clean url/form data from http://www.garyrgilbert.com/tools/coldfusion/cleanScopes.cfm.txt --->
<cffunction name="cleanScopes" access="public" returntype="void">
<cfargument name="scopesToClean" type="string" required="yes">
<cfargument name="charlist" type="string" required="no" default="">
<cfscript>
reTags ="<[^/>]*>|</.*>";
</cfscript>
<cfloop list="#scopestoClean#" index="scopeName">
<cfif not findnocase("multipart/form-data",cgi.CONTENT_TYPE)>
<cfscript>
s=Evaluate(scopeName);
for(field in s)
if (isSimpleValue(s[field])){
if(reTags neq '')
do { prev=s[field];
s[field]=REReplaceNoCase(s[field],reTags,"","ALL");
} while (prev NEQ s[field]);
structUpdate(s,field,prev);
if (charlist neq '')
s[field] = replacelist(s[field],charlist,'');
}
</cfscript>
</cfif>
</cfloop>
<cfreturn>
</cffunction>
感谢您的时间。
答案 0 :(得分:4)
我建议不要试图以全球方式捕捉一切。无论您的全球保护代码有多复杂和复杂,都不可避免地会出现一些问题。
相反,“正确”(用于它的价值)方法是清理在页面上(或在电子邮件中等)呈现的所有内容 - 在输出期间 - 作为用户输入开始其生命。
那就是说,看看OWASP。它们拥有出色的库,可以防止各种攻击,包括你提到的各种攻击(sqli,xss,crlf)。我的一位同事最近将其中一些库包装到我们可以在我们的应用程序中使用的CFC中and explained how to use it on our developers blog:
AntiSamy
如果您的应用程序接受用户生成的HTML,例如说博客评论,则需要确保清理输入以防止XSS攻击。您不希望有人能够在您的博客评论中输入恶意代码,因此您需要某种方式来过滤输入。输入AntiSamy。 AntiSamy允许您根据其术语策略轻松过滤用户生成的HTML。 AntiSamy是一个Java项目,因此我将其打包到CFC中,以便在ColdFusion中使用。
使用AntiSamy的简单方法是创建AntiSamy组件的实例(cfc.owasp.AntiSamy)并在输入上调用getCleanHTML()方法。
<cfset antisamy = CreateObject("component","cfc.owasp.antisamy") /> <cfset cleanHTML = antisamy.scan(form.someInput) />
这将使用默认(相当宽松的)策略文件运行AntiSamy并返回干净的HTML标记。
ESAPI编码器
我从OWASP项目中带来的下一个库是ESAPI Encoder。这是一个Java项目,我已经将其包装在CFC中以便于使用。编码器提供了几种编码方法,超出ColdFusion附带的编码方法。一些更有用的方法包括encodeForJavaScript(),encodeForHTMLAttribute()和encodeForCSS()。使用该组件非常简单,只需实例化它并调用适当的方法。
<cfset encoder = CreateObject("component","cfc.owasp.Encoder") /> <cfset html = encoder.encodeForHTML("<body onload=""alert('XSS')"">Test</body>") />
这个库提供的一个非常有用的方法是canonicalize方法。 documentation from the beta version of the ESAPI Encoder很好地描述了这种方法的作用。
但是,如果你坚持全球解决方案,为什么要重新发明轮子呢?为什么不试试像FuseGuard这样的东西。价格可能低于开发时间的成本,这些开销时间将用于拼凑,调试和处理突破本土系统的安全问题。
答案 1 :(得分:0)
就个人而言,我并不确定这种“全球”方法是最好的。我检查接受外部数据的所有型号中的所有传入数据,并针对每种情况使用特定的验证规则。所以额外的层看起来有点过分。
此类脚本不会保护您不将字符串放入传入URL的数字ID中 - 您必须以任何方式检查它。您必须以任何方式在视图中使用HTMLEditFormat / XMLFormat,依此类推。
P.S。 CFScript的列表循环:
for (i=1; i LTE ListLen(scopestoClean); i++) {
scopeName = ListGetAt(scopestoClean,i);
//... following code
}