出题功能改进


  • 0

    在运行目标代码前允许先注入一段代码,比如可以用于屏蔽eval,new Function等等


  • 0
    administrators

    @CodeHz 用户代码一般都是放在函数里面,目前来说你可以:

    assert.notMatch(userFunc.toString(), /eval/, '不能使用 eval') 
    

    来进行简单的检测。或者在执行用户代码之前先重写 eval 方法。

    现在其实后台会把所有代码先解析成 ast ,后续打算把 ast 开发给出题系统,这样就可以对用户代码语法做更严格、精细的检测。


  • 0

    @胡子大哈 关键词检测容易误杀。。。基于AST的我估计可能可以,但是感觉不够彻底。。。毕竟你可以window["ev"+"al"]或者搞一大段什么东西来干

    但是执行用户代码之前执行,目前还没有提供啊。。。虽然用户代码是生成一个函数,但是eval实在定义函数时就被绑定了的。。如果在测试代码里重写eval,并没有什么卵用

    不过如果对于eval这类的话,也可以考虑用内容安全策略,这样应该是最彻底的了。。


  • 0
    administrators

    @CodeHzmain 函数里面重写 window.eval ,然后再执行用户函数应该可以?毕竟它定义的时候还没执行

    function userFunc () { eval() }
    function main () {
      window.eval = () => console.log('no')
      userFunc() // => no
    }
    

    内容安全策略 <- 这个好,我看看。


  • 0

    @胡子大哈

    userFunc = (eval => () => eval('"yes"'))(eval)
    function main () {
      window.eval = () => console.log('no')
      console.log(userFunc())
    }
    

  • 0
    administrators

    @CodeHz 那我只能给你加 setup 功能代码了。


登录后回复
 

与 ScriptOJ 的连接断开,我们正在尝试重连,请耐心等待