跳到主要内容

技术研究:Yaklang 新语言引擎更新解析

· 阅读需 5 分钟
Yak Project
网络安全垂直语言团队

背景

前段时间 Yaklang 实现了重构,在实现原有语法的基础上增加了很多新的语法,非常的好用。在之前的一次更新中,我们悄咪咪的更新了语言引擎,现在经过了几个版本的迭代,新语言引擎逐渐稳定。本篇简单介绍下新语言引擎一些有意思的更新内容。

报错信息

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

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

错误处理

回顾下之前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循环

除了支持传统的*for* i=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中标注出来,编译时会抛出编译错误

总结

本篇介绍了 Yaklang 的部分更新,现在可以在插件中使用新语法,完整介绍请参见官网教程。

往期推荐

实用技巧|渗透测试中的流量修改

安全能力强化:Fuzztag再升级!

仅需10秒!从批量爆破请求中提取关键数据,安全能力基座功能强化ing

新功能:史上最好用的反连&JavaHack,安全能力基座强化ing

你们要的 [Yaklang websocket劫持]教程来了!


本文首发于 Yak Project 公众号,阅读原文