猿问

以字符串形式存储在 DB 中的 Eval 代码段

我正在将我的应用程序的一部分从 PHP 迁移到 Go。我正在存储一些代码以在 MySQL 中进行 eval,例如:checkGeo('{geo:["DE","AU","NL"]}') && check0s('{os:["android"]}'). 在 PHP 中很容易,只是eval($stringToEval),但是如何在 Go lang 中做到这一点?


犯罪嫌疑人X
浏览 190回答 3
3回答

慕勒3428872

你不需要为这类事情引入一个成熟的解释器:编写一个简单的解析器,将你的脚本分解成语法树,然后编写代码来遍历该树并“评估”它。对于像您这样的简单案例来说,这并不难。当然,您的语法可能比 PHP 的更简单,因为您不想要 PHP 评估器的全部功能。一个简单的示例是rpn,但您可以更简单地发明一种将查询存储在 JSON 中的方法。另请注意,Go 有一个 Go 包形式的 Go 解析器——go/parser因此您可以使用(最小)Go 语法编写查询,使用解析它们go/parser并仅实现一个评估器,该评估器将遍历解析器生成的 AST 并计算结果. 但鉴于您提供的示例,我认为这将是一种过度设计。还有一个小问题:存储将由成熟的评估器(如 PHP)评估的代码是危险的:如果有人设法将调用exec()或类似内容注入您的表中,结果将是次优的。因此,从安全的角度来看,拥有一个原始的解析器/评估器也是一个好处。
随时随地看视频慕课网APP

相关分类

Go
我要回答