我希望能够允许社区成员提供他们自己的javascript代码供其他人使用,因为用户的想象力远远超过我能想到的任何东西.
但这提出了安全性的固有问题,特别是当目的是允许外部代码运行时.
那么,我可以禁止eval()
提交并完成它吗?或者还有其他方法来评估代码或导致javascript中的大规模恐慌?
还有其他事情要禁止,但我主要担心的是,除非我能阻止执行字符串,否则我可以规避任何其他过滤器以用于特定方法.可行,或者我是否必须诉诸要求作者提供Web服务界面?
由于HTML5现已可用,因此您可以将沙箱用于不受信任的JavaScript代码.
关于沙盒框架的OWASP HTML5安全备忘单评论:
将iframe的sandbox属性用于不受信任的内容.
iframe的沙箱属性允许对内容中的内容进行限制
iframe
.设置沙箱属性时,以下限制处于活动状态:
所有标记都被视为来自独特的来源.
所有表单和脚本都被禁用.
禁止所有链接定位到其他浏览上下文.
自动触发的所有功能都将被阻止.
所有插件都被禁用.
可以
iframe
使用sandbox
属性的值对功能进行细粒度控制.在不支持此功能的旧版本用户代理中,将忽略此属性.使用此功能作为附加保护层,或检查浏览器是否支持沙盒框架,并仅在支持时显示不受信任的内容.
除了这个属性,为了防止Clickjacking攻击和未经请求的框架,我们鼓励使用
X-Frame-Options
支持deny
和same-origin
值的标头.if(window!== window.top) { window.top.location = location; }
不建议使用其他解决方案,如framebusting .
您可以允许脚本运行,同时保持其他限制.但是,您应确保脚本从与主要内容不同的域运行,以防止攻击者通过重定向用户直接加载页面(即不通过IFrame)进行XSS攻击.
这将限制脚本eval
用于攻击您的主域,但这可能会阻止脚本实际上足够强大以满足您的需求.与您的主域名的任何互动都必须通过Window.postMessage
.如果限制太多,那么@ bobince的答案仍然有最好的解决方法建议.
有关如何安全实施沙箱的详细信息,请参阅我的其他答案.
或者还有其他方法来评估代码
您无法过滤掉eval()
脚本解析级别的调用,因为JavaScript是一种图灵完备语言,可以对调用进行模糊处理.例如.看看svinto的解决方法.您可以window.eval
通过使用空值覆盖它来隐藏,但确实有其他方法来评估代码,包括(仅仅是我的头脑):
新功能('代码')()
文件撰写( '%3Cscript>代码%3C /脚本>')
使用document.createElement( '脚本').使用appendChild(document.createTextNode( '代码'))
window.setTimeout('code',0);
window.open(...)的eval( '代码')
location.href = '的javascript:代码'
在IE中,style/node.setExpression('someproperty','code')
在某些浏览器中,node.onsomeevent ='code';
在旧版浏览器中,Object.prototype.eval('code')
或导致javascript中的大规模恐慌?
那么createElement('iframe').src ='http://evil.iframeexploitz.ru/aff=2345'是你可以期待的更糟糕的攻击之一......但实际上,当脚本有控制权时,它可以做用户可以在您的网站上的任何内容.它可以让他们在你的论坛上发布"我是一个大的恋童癖者!"一千次然后删除他们自己的帐户.例如.
我是否必须诉诸要求作者提供网络服务界面?
是的,或者:
什么都不做,让想要这个功能的用户下载GreaseMonkey
审核每个脚本提交自己
使用您自己(可能类似于JavaScript)的迷你语言,您实际上可以控制它
Google Caja可能会让您感兴趣的是后者的一个例子.我不完全确定我会信任它; 这是一项艰苦的工作,到目前为止他们肯定有一些安全漏洞,但如果你真的必须采取这种方法,它就是最好的.
确实没有任何方法允许任意Javascript执行是安全的.实际上,您提供的用于防止恶意代码的任何类型的过滤都会剥离访问类似功能或数据的合法代码.我不认为你想做的事情是可行的.