freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Yaklang 升级: 更灵活的语法让写插件变得更轻松
2023-02-09 17:34:26
所属地 四川省

背景

前段时间 Yaklang 实现了重构,在实现原有语法的基础上增加了很多新的语法,非常的好用。在之前的一次更新中,我们悄咪咪的更新了语言引擎,现在经过了几个版本的迭代,新语言引擎逐渐稳定。本篇简单介绍下新语言引擎一些有意思的更新内容。完整的语言教程已经在官网更新 https://www.yaklang.com/docs/yak-basic/intro。

报错信息

报错信息是最直观的,新引擎的报错更好看了,更方便我们写代码时排查错误。

错误信息中包含了触发异常的调用栈文件路径触发错误的代码所处结构(函数或是全局代码)行号和异常代码预览

错误处理

回顾下之前YAK的异常处理,很像Go的风格,例如

data,err = codec.DecodeBase64("aaa") if err{ log.info("decode error: %v",err) return } dump(data)

YAK还增加了die函数,有点类似assert ,有错误则直接panic,没错则什么也不处理

data,err = codec.DecodeBase64("aaa") die(err) dump(data)

本次更新增加了小尾巴,效果和die类似,如下,在函数调用后增加一个~,函数的最后一个返回值会被小尾巴吃掉,并且对它检查,如果不为空则panic。

data = codec.DecodeBase64("aaa")~ dump(data)

try-catch的支持如下,可以对代码块捕获panic信息,当出现panic时会直接进入catch代码块处理异常。不影响代码后续执行。

try-catch还可以与小尾巴一起使用,可以对 ` 从请求包提取url instance ` 这个代码块进行异常捕获,相较于之前每次函数调用都要处理error方便多了。

字符串

字符串在原本基础上,支持了前缀,包括b、f、x。前缀b用法和python类似,可以直接创建[]byte类型数据,前缀用法f类似javascript,可以通过${}执行表达式并拼接到字符串中,x是YAK特有的Fuzztag语法,与WebFuzzer的Fuzztag相同

除此之外还有一些有意思的语法糖,如字符串格式化、字符串切片,使用*重复字符串

类型内置函数

字符串、列表、字典类型都支持了内置函数,这里只演示几个比较常用的函数,全部函数可以去官网查看(代码补全也可以看)

For循环

除了支持传统的fori=0;i<n;i++ {}用法,还支持golang风格的for index,value = range list{},还有新增的python风格的for in

for v in ["a", "b", "c", "d"] { print(v) } // abcd

还有YAK风格的for-number用法,下面的for infor range是等价的

for i in 4 { print(i) } // 0123 for i range 4 { print(i) } // 0123 for range 4 { print(1) } // 1111

作用域相关

新版本对作用域进行了更严格的限制,支持块级作用域

if true { a = 1 } dump(a) // 输出为nil

顺便还解决了旧版本的老问题,以后可以这样使用了

for i = range 10{ go func(i){ print(i) }(i) } time.sleep(1) // 输出 9861405732

支持闭包,闭包函数定义时会继承当前作用域,如下,虽然For循环结束了,但For代码块的作用域由于被闭包函数继承,所以并不会被销毁。

a = 1 for i = range 10{ a = func(){ println(i) } } a() // 输出9

STRICT模式

对于未声明的变量,Yaklang的处理方式是赋予nil值并在控制台warn log警告。但这种对未声明变量的使用,几乎都是非预期的,可能会造成一些非预期的错误,所以提供了strict模式。

在环境变量中添加YVMODE=strict即可开启

对于未声明变量,会在Yak Runner中标注出来,编译时会抛出编译错误

# 网络安全技术
本文为 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者