我可以在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和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='<'s*(object|embed|script|applet|meta)'>
<string><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();
- 我可以使用javascript将提示输入的第一个字母大写吗
- 我可以重置文本输入而不清除它吗
- Javascript:我可以根据提示输入在数组中找到数字的索引吗
- 如何更改 HTML 数据列表输入上显示的图标?隐藏是可能的,但我可以将其更改为其他一些图标,例如向下箭头
- 我可以在运行时检索输入类型的名称值
- 在下划线js,我可以在输入后使用弹拨方法获取多列,其中方法作为linq选择投影
- 我可以使用 JavaScript 或任何其他技术根据用户输入将焦点切换到窗口或选项卡上吗?
- 我可以在不通过下拉列表的情况下让 jQuery 自动完成以匹配输入吗?
- 我可以让时间选择器在输入字段中单击时触发吗?
- 我可以在 html 输入标签元素中获取变量 ID 吗?
- 我可以使用引导文件输入将文件上传到服务器吗?它是否支持像jquery多文件上传器这样的服务器上传
- 我可以定义一个函数来处理在 2 个输入标签上定义的“更改键控”事件吗?这是个好主意吗
- 我可以使用 Jquery UI 日期选择器来更改键盘输入日期的格式吗?
- 我可以't使我的线条粗细对修改后的输入做出正确响应
- 为什么我可以't使用JQuery更新输入标签的值,并在其中放入€字符?我获得â¬字符串而不是欧
- 我可以'我在HTML5游戏中没有鼠标输入
- 我可以在CF11中获得强大的XSS保护吗?我可以在不接触每个查询或输入的情况下将其应用于整个网站
- 在Ember中,我可以向组件提供输入标记,而不破坏我的表单吗
- 我可以从DOM上更远的动态创建的HTML输入元素中捕获更改事件吗
- 我可以't编辑我的<输入类型=“;文件“>标签