如何让外部代码“安全”运行?只是禁止eval()?
我希望能够让社区成员提供他们自己的javascript代码供其他人使用,因为用户的想象力远远超过我想象的任何东西。如何让外部代码“安全”运行?只是禁止eval()?
但是这引起了固有的安全问题,特别是当目的是要允许外部代码运行。
那么,我可以从提交中禁止eval()
并完成它吗?或者有其他方法来评估代码或导致在JavaScript大规模恐慌?
还有其他的东西是不允许的,但我主要关心的是,除非我可以阻止字符串被执行,否则无论我为特定方法放置哪些其他过滤器都可以规避。是否可行,还是我不得不求助于作者提供Web服务界面?
还是有其他的方法来评估代码
你不能在一个脚本解析级过滤掉调用eval()
因为JavaScript是一种图灵完成语言,可以混淆调用。例如。请参阅svinto的解决方法。您也可以用一个空值覆盖它隐藏window.eval
,但确实有其他的方法来评估代码,包括(只是把我的头顶部):
- 新功能(“代码”)()
- 文件撰写( '%3Cscript>代码%3C /脚本>')
- 使用document.createElement( '脚本')。使用appendChild(document.createTextNode( '代码'))
- window.setTimeout( '代码' ,0);
- window.open(...)的eval( '代码')
- location.href = '的javascript:代码' 在IE
- ,风格/ node.setExpression( 'someproperty', '代码')
- 在某些浏览器中,node.onsomeevent ='code';
- 在较旧的浏览器中,Object.prototype。eval('code')
或者在javascript中导致大量的恐慌?
那么createElement('iframe')。src ='http://evil.iframeexploitz.ru/aff=2345'是你可以期待的更糟的攻击之一......但真的,当一个脚本拥有控制权,它可以为用户在您的网站上做任何事情。它可以让他们在你的论坛上张贴“我是一个很大的恋童癖者!”一千次,然后删除他们自己的帐户。例如。
我不得不求助于作者提供一个Web服务接口吗?
是,或:
- 什么也不做,让谁想要这个功能下载的GreaseMonkey用户
- 兽医每个脚本提交自己
- 使用自己的(潜在的JavaScript等)的迷你语言你实际上有控制权
你可能感兴趣的后者的一个例子是Google Caja。我不完全相信我会信任它;这是一项艰巨的工作,迄今为止他们肯定有一些安全漏洞,但是如果你真的必须采取这种方法,这是最好的。
真的没有任何方法允许任意的Javascript执行可以安全。实际上,您为防止恶意代码提供的任何过滤都会剥离访问类似功能或数据的合法代码。我不认为你想要这样做是可行的。
不,你几乎不能阻止用户提供的Javascript代码运行任何它想要的 - 甚至不允许它运行任意程序(它可能是一个Javascript解释器本身,在这种情况下它只是实现eval()
函数以及许多其他方式 - 例如,它可以将字符串形式的某些事件处理程序添加到HTML中,然后执行它们,它可以创建一个新脚本等)。
如果你的站点不需要这个用户提供的JS在其他用户的计算机上运行,那么我只会发出一个大的警告,添加一些人为控制(可以标记恶意代码),也许一些反病毒服务器上的软件(对此不太了解)。
警告不能帮助用户作出明智的决定。他们只是推卸责任。 – 2009-09-30 18:02:53
过滤掉eval可能不起作用。我想像你可以像这样破解它:window['ev' + 'al']('alert("hello world");');
。你当然可以更换eval函数...
由于HTML5现已发布,因此您可以将sandbox用于不可信的JavaScript代码。
上Sandboxed frames的OWASP HTML5 Security Cheat Sheet评论:
- 使用不受信任内容的iframe的沙箱属性。
iframe的sandbox属性可以限制
iframe
中的内容。设置沙箱属性时,以下限制处于活动状态:
所有标记均视为来自独特来源。
所有窗体和脚本都被禁用。
- 所有链接都被阻止定位其他浏览上下文。
- 自动触发的所有功能都被阻止。
所有插件都被禁用。
使用属性的值可以对
iframe
功能进行细化控制。在旧版本的不支持该功能的用户代理中,该属性将被忽略。使用此功能作为附加防护层,或者检查浏览器是否支持沙盒框架,并只在支持时才显示不可信内容。
- 从此属性
除此之外,防止点击劫持的攻击和主动取景它鼓励使用支持的
deny
和same-origin
值的头X-Frame-Options
。不推荐其他解决方案,如框架破坏if(window!== window.top) { window.top.location = location; }
。
您可以允许脚本,同时保持其他限制到位运行。但是,您应确保脚本运行在与主要内容不同的域中,以防止攻击者重定向用户直接加载页面(即不通过IFrame)的XSS攻击。
这将限制脚本使用eval
攻击您的主域,但也可能会阻止脚本实际上足够强大以满足您的需求。与主域名的任何互动都必须通过Window.postMessage
。如果这太严格了,那么@bobince's answer对于解决方法仍然有最好的建议。
请参阅my other answer了解如何安全实施沙箱的详细信息。
您需要在沙盒环境中执行不受信任的代码。这意味着要创建一个具有属性的iframe(请参阅this article),并在该框架内另外创建一个Web工作器(以便代码在单独的线程中运行,并且在用户提交了某些奇怪的事情时不会挂起UI) 。
如果您需要以某种方式与沙箱中的代码进行交互,可以使用messaging mechanism。这有点棘手,但是有一些库简化了任务,包括我自己创建的一个库:https://github.com/asvd/jailed
有着悠久的安全工作经验,他们将无限权限的语言和“驯服”为安全。请参阅上面提到的Joe-E语言和Caja语言。 – 2009-09-30 18:02:21