Javascript 如何生成外部代码';安全';跑?只要禁止eval()?

Javascript 如何生成外部代码';安全';跑?只要禁止eval()?,javascript,security,xss,Javascript,Security,Xss,我希望能够允许社区成员提供自己的javascript代码供其他人使用,因为用户的想象力远远超出了我的想象 但这会引发固有的安全问题,特别是当其目的是允许外部代码运行时 那么,我是否可以禁止eval()提交,并将其处理完毕?或者有没有其他方法来评估代码或在javascript中引起大众恐慌 还有其他一些事情是不允许的,但我主要担心的是,除非我能够阻止字符串被执行,否则我为特定方法添加的任何其他过滤器都可以绕过。是可行的,还是我必须要求作者提供一个web服务接口?允许任意Javascript执行真的

我希望能够允许社区成员提供自己的javascript代码供其他人使用,因为用户的想象力远远超出了我的想象

但这会引发固有的安全问题,特别是当其目的是允许外部代码运行时

那么,我是否可以禁止
eval()
提交,并将其处理完毕?或者有没有其他方法来评估代码或在javascript中引起大众恐慌


还有其他一些事情是不允许的,但我主要担心的是,除非我能够阻止字符串被执行,否则我为特定方法添加的任何其他过滤器都可以绕过。是可行的,还是我必须要求作者提供一个web服务接口?

允许任意Javascript执行真的没有安全的方法。实际上,为防止恶意代码而提供的任何类型的过滤都会去除访问类似函数或数据的合法代码。我不认为你希望这样做是可行的。

不,你实际上无法阻止用户提供的Javascript代码运行它想要的任何东西-即使不允许
eval()
也无法阻止它运行任意程序(它可能是Javascript解释器本身,在这种情况下它只实现
eval()
函数,以及许多其他方法-例如,它可以添加HTML和一些字符串形式的事件处理程序,然后执行它们,它可以
document.write()
一个新脚本等)


如果你的站点不需要这个用户提供的JS在其他用户的计算机上运行,我只需要发出一个大大的警告,添加一些人工控制(可能会标记恶意代码),或者在服务器上安装一些防病毒软件(对此知之甚少)。

过滤掉eval可能不起作用。我想你可以这样破解它:
window['ev'+'al']('alert(“helloworld”)。您当然可以替换eval函数

或者是否有其他方法来评估代码

您无法在脚本解析级别筛选出对
eval()
的调用,因为JavaScript是一种图灵完整语言,可以在其中混淆调用。看看斯文托的变通方法。您可以通过使用空值覆盖它来隐藏
window.eval
,但实际上还有其他方法来计算代码,包括(我想不起来):

  • 新函数('code')()
  • document.write(“%3Cscript>代码%3C/script>”)
  • document.createElement('script').appendChild(document.createTextNode('code'))
  • setTimeout('code',0)
  • window.open(…).eval('代码')
  • location.href='javascript:code'
  • 在IE中,style/node.setExpression('someproperty','code')
  • 在某些浏览器中,node.onsomeevent='code'
  • 在较旧的浏览器中,Object.prototype.eval('代码')
还是在javascript中引起大众恐慌

Well createElement('iframe').src='http​://邪恶。ifz.ru/aff=2345'是您可以预期的最糟糕的攻击之一。。。但实际上,当脚本拥有控制权时,它可以在您的站点上执行用户可以执行的任何操作。它可以让他们在你的论坛上发布上千次“我是一个老恋童癖”,然后删除他们自己的帐户。比如说

我是否必须要求作者提供一个web服务接口

是,或者:

  • 不做任何事情,让想要此功能的用户下载GreaseMonkey
  • 审查每一个脚本提交自己
  • 使用您自己的(可能类似JavaScript的)迷你语言,您实际上可以控制它
您可能会感兴趣的后一个例子是。我不完全确定我会相信它;这是一项艰巨的工作,到目前为止,他们肯定有一些安全漏洞,但如果你真的必须采取这种方法,这是最好的方法。

既然现在可以使用,你就可以对不受信任的JavaScript代码使用

评论如下:

  • 对不受信任的内容使用iframe的sandbox属性
  • iframe的sandbox属性允许对
    iframe
    中的内容进行限制。设置沙盒属性时,以下限制处于活动状态:

  • 所有标记都被视为来自唯一的来源

  • 所有表单和脚本都被禁用

  • 禁止所有链接指向其他浏览上下文
  • 所有自动触发的功能都被阻止
  • 所有插件都被禁用

    可以使用
    sandbox
    属性的值对
    iframe
    功能进行细粒度控制

  • 在不支持此功能的旧版本用户代理中,此属性将被忽略。使用此功能作为附加保护层,或者检查浏览器是否支持沙盒框架,并且仅在支持的情况下显示不受信任的内容

  • 除此属性外,为了防止点击劫持攻击和未经请求的成帧,建议使用标题
    X-Frame-Options
    ,该标题支持
    deny
    同源
    值。不建议使用其他解决方案,如框架分解
    if(window!==window.top){window.top.location=location;}

您可以允许脚本运行,同时保留其他限制。但是,您应该确保脚本从与主内容不同的域运行,以防止攻击者将用户重定向到直接加载页面(即不通过IFrame)进行攻击

这将限制脚本使用
eval
攻击您的主域,但这也可能会阻止脚本真正强大到足以满足您的需求。与主域的任何交互都必须通过。如果这太严格了