Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

Function构造器的参数处理问题

  我们可以通过Function构造器来生成新的函数,这个操作的前n个参数是作为函数的参数列表,最后一个参数作为函数体。它应该检测参数列表的格式合法性和函数体内是否有语法错误,这些过程在各引擎上的实现多少都有点问题,我们可以看到v8晦涩的一面。
  首先,Function构造器的前n个参数会被作为字符串拼接起来使用,他们不是逐个解析的,所以我们可以跨参数插入注释。 new Function("/*","a","*/","");   这么写是合法的,那就需要考虑这个函数有没有可以注入的漏洞。比如缺少结束注释呢? new Function("/*","a","");
  当然按照规范应该先检测参数列表的合法性,缺少结束注释是不合法的,所以Firefox和IE都抛出注释未结束的异常。但是Chrome呢?这个代码在Chrome上正常执行了,但是它并没有注入任何东西。我们可以从Chrome控制台看到这个函数生成后的样子,在参数列表的后一行有一对多行注释,因此我们未结束的注释就被它吞掉了,不会再继续向后影响。
  Chrome不检查参数列表的合法性吗?不对,它当然是会检查的,但它是和函数体一起用于生成函数时检查的。所以才需要这么晦涩的加入一对多行注释来规避问题。挡住注释只能确保注释不影响代码,但是插入小括号使函数提早结束呢?
new Function("){};function(","");
  当然,这是不可执行的,否则就是个重大漏洞了。但是,他们抛出的异常不同。Firefox的异常信息应该是最规范的了,IE的语法错误也可以理解为参数列表的语法错误,但是Chrome的错误简直匪夷所思,Function的参数字符串包含小括号?这算什么错误理由!谁这么规定的? new Function("/*()*/","");
  为什么Chrome不允许Function的参数字符串中使用小括号呢?根本问题就是它没对参数列表做独立的词法检测,而是直接和函数体拼接成完整的函数字符串后做词法分析。目前确实也没想到什么可以注入它的方法,但是随着以后词法的扩充,这里可能就是一个安全隐患。
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^