用友软件首页

XSS前端防火墙 内联事件拦截

2019-4-10 8:0:0 wondial

XSS前端防火墙 内联事件拦截

XSS前端防火墙 内联事件拦截

关于 XSS 怎样形成、如何注入、能做什么、如何防范,前人已有无数的探讨,这里就不再累述了。

几乎每篇谈论 XSS 的文章,结尾多少都会提到如何防止,然而大多万变不离其宗。要转义什么,要过滤什么,不要忘了什么之类的。尽管都是众所周知的道理,但 XSS 漏洞十几年来几乎从未中断过,不乏一些大网站也时常爆出,小网站更是家常便饭。

而本文介绍的则是另一种预防思路——通过前端监控脚本,让每一个用户都参与漏洞的上报。

预警系统

事实上,至今仍未有一劳永逸的解决方案,要避免它依旧使用最古老的土办法,逐个的过滤。然而人总有疏忽的时候,每当产品迭代更新时,难免会遗漏一些新字段,导致漏洞被引入。

即使圣人千虑也有一失,程序出 BUG 完全可以理解,及时修复就行。但令人费解的是,问题出现到被发现,却要经过相当长的时间。例如不久前贴吧 XSS 蠕虫脚本,直到大规模爆发后经用户举报,最终才得知。其他网站大多也类似,直到白帽子们挖掘出漏洞,提交到安全平台上,最终厂商才被告知。若遇到黑客私下留着这些漏洞慢慢利用,那只能听天由命了。

因此,要是能有一套实时的预警系统,那就更好了。即使无法阻止漏洞的发生,但能在漏洞触发的第一时间里,通知开发人员,即可在最短的时间里修复,将损失降到最低。各式各样的应用层防火墙,也由此产生。

不过,和传统的系统漏洞不同,XSS 最终是在用户页面中触发的。因此,我们不妨尝试使用前端的思路,进行在线防御。

XSS 内联事件

先来假设一个有 BUG 的后台,没有很好处理用户输入的数据,导致 XSS 能被注入到页面:

<img src="{路径}" /><img src="{路径" onload="alert(/xss/)}" />

只转义尖括号,却忘了引号,是 XSS 里最为常见的。攻击者们可以提前关闭属性,并添加一个极易触发的内联事件,跨站脚本就这样被轻易执行了。

那么,我们能否使用前端脚本来捕获,甚至拦截呢?

被动扫描

最简单的办法,就是把页面里所有元素都扫描一遍,检测那些 on 开头的内联属性,看看是不是存在异常:

例如字符数非常多,正常情况下这是很少出现的,但 XSS 为了躲避转义有时会编码的很长;例如出现一些 XSS 经常使用的关键字,但在实际产品里几乎不会用到的。这些都可以作为漏洞出现的征兆,通知给开发人员。

不过,土办法终究存在很大的局限性。在如今清一色的 AJAX 时代,页面元素从来都不是固定的。伴随着用户各种交互,新内容随时都可能动态添加进来。即使换成定期扫描一次,XSS 也可能在定时器的间隔中触发,并销毁自己,那样永远都无法跟踪到了。况且,频繁的扫描对性能影响也是巨大的。

如同早期的安全软件一样,每隔几秒扫描一次注册表启动项,不仅费性能,而且对恶意软件几乎不起作用;但之后的主动防御系统就不同了,只有在真正调用 API 时才进行分析,不通过则直接拦截,完全避免了定时器的间隔遗漏。

因此,我们需要这种类似的延时策略 —— 仅在 XSS 即将触发时对其分析,对不符合策略的元素,进行拦截或者放行,同时发送报警到后台日志。

主动防御

『主动防御』,这概念放在前端脚本里似乎有些玄乎。但不难发现,这仅仅是执行优先级的事而已 —— 只要防御程序能运行在其他程序之前,我们就有了可进可退的主动权。对于无比强大的 HTML5 和灵活多变的 javascript,这些概念都可以被玩转出来。

继续回到刚才讨论的内联事件 XSS 上来。浏览器虽然没提供可操控内联事件的接口,但内联事件的本质仍是一个事件,无论怎样变化都离不开 DOM 事件模型。

扯到模型上面,一切即将迎刃而解。模型是解决问题的最靠谱的办法,尤其是像 DOM-3-Event 这种早已制定的模型,其稳定性毋庸置疑。

即便没仔细阅读官方文档,但凡做过网页的都知道,有个 addEventListener 的接口,并取代了曾经一个古老的叫 attachEvent 的东西。尽管只是新增了一个参数而已,但正是这个差别成了人们津津乐道的话题。每当面试谈到事件时,总少不了考察下这个新参数的用途。尽管在日常开发中很少用到它。

关于事件捕获和冒泡的细节,就不多讨论了。下面的这段代码,或许能激发你对『主动防御』的遐想。

<button onclick="console.log('target')">CLICK ME</button><script>document.addEventListener('click', function(e) {console.log('bubble');});document.addEventListener('click', function(e) {console.log('capture');//e.stopImmediatePropagation();}, true);</script>

Run

尽管按钮上直接绑了一个内联的事件,但事件模型并不买账,仍然得按标准的流程走一遍。capture,target,bubble,模型就是那样固执。

不过,把那行注释的代码恢复,结果就只剩 capture 了。这个简单的道理大家都明白,也没什么好解释的。

但仔细揣摩下,这不就是『主动防御』的概念吗?捕获程序运行在内联事件触发之前,并且完全有能力拦截之后的调用。

上面的 Demo 只是不假思索拦截了所有的事件。如果我们再加一些策略判断,或许就更明朗了:

<button onclick="console.log('xss')">CLICK ME</button><script>document.addEventListener('click', function(e) {console.log('bubble');});document.addEventListener('click', function(e) {var element = e.target;var code = element.getAttribute('onclick');if (/xss/.test(code)) {e.stopImmediatePropagation();console.log('拦截可疑事件:', code);}}, true);</script>

Run

我们先在捕获阶段扫描内联事件字符,若是出现了『xss』这个关键字,后续的事件就被拦截了;换成其他字符,仍然继续执行。同理,我们还可以判断字符长度是否过多,以及更详细的黑白名单正则。

怎么样,一个主动防御的原型诞生了吧。

不过,上面的片段还有个小问题,就是把事件的冒泡过程也给屏蔽了,而我们仅仅想拦截内联事件而已。解决办法也很简单,把 e.stopImmediatePropagation() 换成 element.onclick = null 就可以了。

当然,目前这只能防护 onclick,而现实中有太多的内联事件。鼠标、键盘、触屏、网络状态等等,不同浏览器支持的事件也不一样,甚至还有私有事件,难道都要事先逐一列出并且都捕获吗?是的,可以都捕获,但不必事先都列出来。

因为我们监听的是 document 对象,浏览器所有内联事件都对应着 document.onxxx 的属性,因此只需运行时遍历一下 document 对象,即可获得所有的事件名。

<img src="*" onerror="alert('xss')" /><script>function hookEvent(onevent) {document.addEventListener(onevent.substr(2), function(e) {var element = e.target;if (element.nodeType != Node.ELEMENT_NODE) {return;}var code = element.getAttribute(onevent);if (code && /xss/.test(code)) {element[onevent] = null;alert('拦截可疑事件:', code);}}, true);}console.time('耗时');for (var k in document) {if (/^on/.test(k)) {//console.log('监控:', k);hookEvent(k);}}console.timeEnd('耗时');</script>

Run

现在,无论页面中哪个元素触发哪个内联事件,都能预先被我们捕获,并根据策略可进可退了。

性能优化

或许有些事件没有必要捕获,例如视频播放、音量调节等,但就算全都捕捉也耗不了多少时间,基本都在 1ms 左右。

当然,注册事件本来就花不了多少时间,真正的耗费都算在回调上了。尽管大多数事件触发都不频繁,额外的扫描可以忽律不计。但和鼠标移动相关的事件那就不容忽视了,因此得考虑性能优化。

显然,内联事件代码在运行过程中几乎不可能发生变化。使用内联事件大多为了简单,如果还要在运行时 setAttribute 去改变内联代码,完全就是不可理喻的。因此,我们只需对某个元素的特定事件,扫描一次就可以了。之后根据标志,即可直接跳过。

事实上,标志位也没必要使用事件名,用一个不重复的序列号即可。

<div style="width:100%; height:100%; position:absolute; background: red" onmousemove="alert('xss')"></div><script>function hookEvent(onevent, eventHash) {        function scanElement(element) {                // 跳过已扫描的事件        var flags = element['_flag'];        if (!flags) {            flags = element['_flag'] = {};        }        if (typeof flags[eventHash] != 'undefined') {            return;        }        flags[eventHash] = true;                if (element.nodeType != Node.ELEMENT_NODE) {            return;        }                var code = element.getAttribute(onevent);        if (code && /xss/.test(code)) {            element[onevent] = null;            alert('拦截可疑代码:', code);        }                // 扫描上级元素        scanElement(element.parentNode);    }            document.addEventListener(onevent.substr(2), function(e) {        scanElement(e.target);    }, true);}var i = 0;for (var k in document) {    if (/^on/.test(k)) {        hookEvent(k, i++);    }}</script>

Run

这样,之后的扫描仅仅是判断一下目标对象中的标记而已。即使疯狂晃动鼠标,CPU 使用率也都忽略不计了。

到此,在 XSS 内联事件这块,我们已实现主动防御。

对于有着大量字符,或者出现类似 String.fromCharCode,
.getScript 这类典型 XSS 代码的,完全可以将其拦截;发现有 alert(/xss/),alert(123) 这些测试代码,可以暂时放行,并将日志发送到后台,确定是否能够复现。

如果复现,说明已有人发现 XSS 并成功注入了,但还没大规模开始利用。程序猿们赶紧第一时间修 BUG 吧,让黑客忙活一阵子后发现漏洞已经修复了:)

字符策略的缺陷

但是,光靠代码字符串来判断,还是会有疏漏的。尤其是黑客们知道有这么个玩意存在,会更加小心了。把代码转义用以躲避关键字,并将字符存储在其他地方,以躲过长度检测,即可完全绕过我们的监控了:

<img src="*" onerror="window['ev'+'al'](this.align)" align="alert('a mass of code...')">

因此,我们不仅需要分析关键字。在回调执行时,还需监控 eval、setTimeout('...') 等这类能解析代码的函数被调用。

不过,通常不会注入太多的代码,而是直接引入一个外部脚本,既简单又靠谱,并且能实时修改攻击内容:

<img src="*" onerror="
['get'+'Script'](...)">

 

如果您的问题还没有解决,可以到 T+搜索>>上找一下答案

分享到:

微博关注

bj用友软件

最新信息

登入不进去,提示子系统登入失败,其他模块正常

登入不进去,提示子系统登入失败,其他模块正常 登入不进去,提示子系统登入失败,其他模块正常[]

模块有冲突 ,把其他模考都注销试一下
@王国栋wgd:注销后还是这提示
您好:导致此报错原因较多,请按照下面文档排查。
http://service.chanjet.com/zhi ... b45be

电脑重做了系统,用友没备份,怎么能恢复数据呢

电脑重做了系统,用友没备份,怎么能恢复数据呢 电脑重做了系统,用友没备份,怎么能恢复数据呢[]

请参考服务社区-知识库中的文档:非正常备份账套恢复方法:
http://service.chanjet.com/zhi ... 2edd2
参考上面的文档进行恢复

热点文章

新闻资讯

  • 【新年首签】天津用友&通广集团签署战略协议

    【新年首签】天津用友&通广集团签署战略协议

    天津用友软件技术有限公司(以下简称天津用友)和天津通信广播集团有限公司(以下简称通广集团)就企业信息化建设事宜进行战略签约。

    参加此次会议有天津用友总经理赵永春,天津用友副总经理王成岩、通广集团副总经理马严、通广集团科技质量部部长尹刚、七一二公司技术质量部部长门国梁、七一二公司技术中心主任黄建尧等。

    image

  • 会计职场堪比宫斗剧

    会计职场堪比宫斗剧

     近几年,各种宫斗剧火爆,《甄嬛传》《芈月传》等等都脍炙人口,许多人经常打趣自己像某个人物,若是在古代能活到第几集。让人不禁想起,会计职场又何尝不是一场宫斗,每天要察言观色,明了领导的内心,就像后宫谁也不敢惹皇后一样。但当你坐上领导位置的时候,盯着你的眼睛就会很多,稍有不慎就会被取代。就像后宫的嫔妃一样,就算坐上了皇后的位置也要时刻担心有没有人觊觎。

    image

知 识 库

  • 浅议电算化会计中若干会计方法

    浅议电算化会计中若干会计方法

    浅议电算化会计中若干会计方法浅议电算化会计中若干会计方法

      一、电算会计中借贷记账法是否不适用
      在借贷记账法中,“借”既可以表示增,也可以表示减,而“贷”既可以表示减,也可以表示增,卢卡?帕乔利提出的复式借贷簿记方法之所以几百年来一直为人们所推崇,正是因为其“有借必有贷,借贷必相等”的锱铢必较、泾渭分明的科学原理。尽管我国会计实务也曾一段时间对增减记账法和收付记账法情有独钟,但最终仍达成共识,采用了国际上通用的借贷记账法。有人以会计软件常以正、负号分别替代借、贷符号为由,企图说服人们相信这一记账法已经难以胜任新形势。应当注意的是,即使借、贷符号在数据库中不采用“借”和“贷”加以表示,也并不表明借贷记账法就可放弃。不可否认,在将借贷记账凭证的发生额登录到总账之后,对于登账后所结计的期末余额往往以正数表示借方余额,而以负数表示贷方余额,甚至在借贷库文件中只设一个金额字段,在该字段中分别以正负号表示借贷方。但所有这些标记都没能改变“有借必有贷,借贷必相等”的规则,其实质仍然是借贷记账法。这里的正、负号与增减记账法的增减符号的属性风马牛不相及。
      从长远来看,随着原始凭证的逐步电子化,记账凭证的自动生成势在必行,届时,何种记账方法使自动生成更可行,当然要根据其科学性而定。智能软件的设计凭借的是科学的方法和严密的思维与推断,而经过了数百年磨练的借贷记账法,无疑是未来智能专家设计会计软件的最佳选择。当然,一味否定增减记账法的科学性也是错误的。在计算机之中,当采用增减记账法填制记账凭证之后,我们完全可以编写一段简短的程序将其转换为借贷记账法下的相应记账凭证。其转换的主要依据是各该科目的记账符号与所属科目类别。以从银行提取现金为例,在增减记账法下,增记“现金”,减记“银行存款”。现金和银行存款都是资产类科目,对资产类科目,其增加就转换为“借”,其减少就转换为“贷”。依此,也可将借贷记账法下的凭证转换为增减法下的凭证。

      二、“反结账、反记账、取消审核”的可行性
      至今,尚有不少会计核算软件设置“取消审核”、“反记账”、“反结账”的功能。在实际工作中,这些设置的确给会计人员的会计处理带来许多方便,尽管许多学者对此提出异议,但不少实务工作者却对其依依不舍。有的学者甚至认为,在计算机特定的工作环境中,反记账的作用不可替代。其理由是,在实际工作中存在大量错误的记账凭证,如果不施行反记账的做法,则将导致账簿中存在大量无用的冗余信息,影响对会计信息的使用。
      所谓电算化会计中“反记账”,事实上也就是将一批原先已经登录到账簿上的发生额从各该账户再予以扣减,使各该账簿恢复至该批凭证登账之前账簿的发生额和余额状态。毋庸置疑,没有人会赞同手工会计下采用“反记账”。对手工的账簿记录,为了保证其有案可稽,当其发生错误时,不准涂改、挖补、刮擦或者用药水消除字迹,不准重新抄写。同时,对两种出错情况的更正应当分别加以严格处理:一是登记账簿时所发生的错误,“应当将错误的文字或者数字划红线注销,但必须使原有字迹仍可辨认”;在实际工作中,由于记账凭证出错而导致账簿记录发生差错时而发生。一般采用两种方式进行相应的修改:一是红字冲销法,二是补充更正法。这些详细而又具体的规定所强调的一点,那就是对出错之处必需留有修改的痕迹。
      在电算会计之中,记账错误和记账凭证填制错误仍然在所难免。虽然红线注销法在电算会计中难以操作,但对出错的电子数据,却不能不留下修改的痕迹。解决的办法只有一个,保留错误电子数据,另作更改的记账凭证,并据以登录账簿,换言之,要将正与误两张凭证同存于会计档案之中,同时,其所登录的正与误两处账簿记录并存于同一账簿之中。《会计核算软件基本功能规范》第十八条也作出与上相同的规定:“发现已经输入并审核通过或者登账的记账凭证有错误的,可以采用红字冲销法或者补充凭证法进行更正;记账凭证输入时,红字可用‘-’号或者其他标记表示”。
      由上可见,不管是手工会计,还是电算化会计,对出错的修改均强调留有痕迹。事实上,电算化会计中,由于电子数据的修改在技术上可不留痕迹,因而更需要对留有痕迹予以强调。

  • 让信息化给管理会计的推广插上双翼

    让信息化给管理会计的推广插上双翼

    让信息化给管理会计的推广插上双翼让信息化给管理会计的推广插上双翼

      管理会计自西方引入我国以来, 在企业中的实践不尽人意。管理会计本身的决策、控制、预测等功能并未发挥出来,也不能与企业战略较好融合。造成这种局面的原因,一方面是管理会计理论与实践的脱节;另一方面是大部分企业信息处理方式的落后及信息化使用率不高。的确,我国会计信息化起步较晚,在许多中小企业中信息化技术的使用处于较低层次。大部分中小企业虽用会计软件记账,但都是仅从减轻会计人员负担、提高核算效率方面考虑,忽视了管理会计软件的使用,无法为管理会计创造一个良好的推广应用外部环境。
      具体来说,企业信息化程度低下对管理会计实践的负面影响表现在两个方面:一是信息处理方式的落后,信息管理存在不集中、不及时、信息不能共享等缺陷,影响了管理会计实时分析和控制作用;二是管理会计软件开发的严重滞后影响了管理会计决策和预测职能的发挥,无法使企业管理层体会到管理会计的重要作用,导致管理层在主观上轻视对管理会计的应用,并形成一种恶性循环。因此,提高企业的信息化程度是管理会计广泛应用的必要条件,企业信息化程度的高低是管理会计实施效果好坏的重要影响因素。
      用友软件总裁王文京认为,在当今经济和技术环境下,管理会计的开展,需要信息技术和软件系统的支持。目前,很多大型集团企业正在逐步探索建立财务共享中心,这将有助于推进管理会计在企业的运用。其中决策支持信息化包括预算预测、内部控制、决策支持、风险管理、成本分析等管理会计方面的信息化。
      王文京进而指出,包括大型企业成本精细化核算、管理与控制,费用全面管理与控制,全面预算管理,企业内部责任核算及报告等,构成了我国软件企业新的信息化市场机遇与空间。管理会计信息化时代已经来临。
      建立完善的管理会计信息化系统,首先是最大限度整合各类信息和资源,实现资源“共享”。 各部门想从财会部门得到信息,需要有一个可以共享的管理会计信息数据平台,使各个部门都可以在这个共享的信息数据平台寻找到自己所需要的信息,可以集中整合企业的信息资源,有效降低企业收集、加工、分析信息的成本,提高整体效益。其次,管理会计涉及较多的模型和数理统计方法,也需要有较高程度的信息化提供保障。 因此,要推广管理会计在企业中的实践,全面提高企业管理会计信息化程度是非常必要的,将企业的信息化与管理会计融合,让信息化给管理会计的推广插上双翼,管理会计才能在企业中所向披靡。具体来讲,管理会计信息化实现的路径为:
       (一)结合企业战略,明确自身需求,并对自身合理定位,这是有效实施管理会计信息化的前提条件。企业只有认清自身需求和所处的状况,才能开展科学合理、符合实际情况的管理会计信息化建设。对企业财务人员而言,要充分参与企业的决策活动、企业的价值链分析、企业资源规划、供应链管理和企业流程重组等工作,充分发挥管理会计的作用。
      (二)优化企业的管理机制,简化各项工作流程,制定信息规范。企业应优化人力、物力、财力配置,破除各部门之间不合理的壁垒并减少管理层次,制定相应的信息规范,确保原始数据和信息的真实性、准确性、一致性和适用性,建立相关的信息化标准。
      (三)统一规划,设计和建立完善的管理会计信息系统,提高企业的管理效率。在实施管理会计信息化时,设计和建立的管理会计信息系统应能提供企业运行所需的各项功能,包括客观准确的成本核算、及时有效的风险防范、安全的资金集中管理、完善的全面预算管理、严格的内部控制、操作性强的业绩评价体系等功能模块。但不是所有功能模块都需要详尽全面,由于企业所处的信息化发展阶段不同,目标不同,因此,各功能模块的重要程度也应有所不同,应遵循既要全面系统,又要有所侧重的原则。
      (四) 建立起以管理会计为核心的内部管理系统,推进管理会计与业务一体化。加强以计算机管理为基础的管理会计与业务一体化建设,使各部门能及时得到相关管理会计信息。
      除此之外,还应吸收消化国外先进的管理思想,逐步引进到使用先进的管理会计软件,使会计工作由核算型向管理型过渡。
      当然,管理会计信息化实施过程,要分阶段进行,从低级到高级,由简单到复杂发展,要有层次、有步骤地循序渐进,处理好待建各个应用系统或模块间的轻重缓急、先后顺序,决不能脱离实际,盲目操作。管理会计信息化实施是一项长期的、复杂的、综合的系统工程,不能一蹴而就。 

  • 最新文章排行
  • 热门文章排行

管理软件

  • T3卸载就会跳到安装界面去,用360工具也卸载不了。请问这种情况哪位老师遇见过,我们应该如何处理。谢谢、在线等。

    T3卸载就会跳到安装界面去,用360工具也卸载不了。请问这种情况哪位老师遇见过,我们应该如何处理。谢谢、在线等。

    T3卸载就会跳到安装界面去,用360工具也卸载不了。请问这种情况哪位老师遇见过,我们应该如何处理。谢谢、在线等。 T3卸载就会跳到安装界面去,用360工具也卸载不了。请问这种情况哪位老师遇见过,我们应该如何处理。谢谢、在线等。[]

    备份好账套,这种情况只能强制删除了,请备份好账套之后,停止数据库服务和T3产品服务,自动备份服务;然后删除T3安装路径以及C盘下ufcomsql文件夹,然后使用360清除无用注册表,最后重启电脑即可;

  • 用友T3-业务通在11.0的软件中点击打印软件就自动退出

    用友T3-业务通在11.0的软件中点击打印软件就自动退出

    用友T3-业务通在11.0的软件中点击打印软件就自动退出 用友T3-业务通在11.0的软件中点击打印软件就自动退出

    其他的操作都正常,就是某个单据如销货单,点击“打印”—“预览”,或者是“打印”—“打印模板设置”,就自动退出软件了,再登入的时候提示:“该用户已登录,是否重新登录”。该单据的默认打印模板异常,导致一点“打印模板设置”或者是“打印”就自动退出了。1.先登入产品,然后在同一浏览器里输入网址:
    http://127.0.0.1/YWTPRO/CommonPage/printservices/DesignFrame.aspx (新一代业务通);
    2.将异常的模板删除;
    3.点击“新建”按钮,重新建立“打印模板”即可。
    备注:如果是系统模板也是异常的话,可以将系统模板删除再重建。
    如有其它问题,请在下面回复。也可以联系用友畅捷通专业服务商-用友天龙瑞德。
    用友天龙瑞德专业销售用友软件,用友财务软件,维护用友T3用友T6用友U8畅捷通T+。我们将竭诚为您服务。
    联系电话:010-59798025。网址:http://www.kuaiji66.com

关于我们 | 公司动态 | 获奖记录 | 联系我们 | 招聘信息 | 用友产品中心 | 用友云基地
Copyright ©  www.kuaiji66.com  All Rights Reserved 天龙瑞德
京ICP备11046295号-1 技术支持 北京天龙瑞德信息技术有限责任公司   北京海淀上地十街辉煌国际大厦3号楼6层 总机:010-59798025   售后:4009908488
北京天龙瑞德信息技术有限责任公司