JavaScript 由于某种需求必须 eval 拼接代码执行**(不要讨论为什么)**,如果正则过滤掉所有非字母数字和分隔符,的字符,还有恶意代码被执行风险吗?

2023-03-24 20:17:58 +08:00
 LLaMA
1605 次点击
所在节点    信息安全
14 条回复
hellohy
2023-03-24 21:37:01 +08:00
即使您使用正则表达式过滤掉所有非字母数字和分隔符的字符,JavaScript 仍然存在恶意代码被执行的风险,因为恶意代码可以使用各种技巧来绕过这种过滤。

例如,恶意代码可以使用 JavaScript 中的 Unicode 编码来编码其代码,从而使其绕过您的过滤。恶意代码还可以使用 JavaScript 中的注释来隐藏其代码,使其不易被检测到。

另外,使用 eval() 函数执行动态拼接的代码也是不安全的做法,因为它会执行任何传递给它的代码,包括恶意代码。建议使用更安全的方式来执行动态拼接的代码,例如使用 Function() 构造函数或使用模板字面量来拼接代码。

综上所述,为了确保 JavaScript 代码的安全性,建议不要使用 eval() 函数来执行动态拼接的代码,并采取其他措施来防止恶意代码的执行。
LLaMA
2023-03-24 22:16:08 +08:00
@hellohy 过滤掉所有非字母数字和分隔符的字符还怎么使用 JavaScript 中的 Unicode 编码来编码其代码?这是 GPT 的回答吧,全是前后矛盾的内容和废话 @Livid
aloxaf
2023-03-24 22:40:57 +08:00
也就是说你要 eval 的内容只包含数字、字母、逗号?
我认为这样应该确实没法执行恶意代码了,但是我有点难以想象这是什么内容——你确定没有方括号,引号之类的字符吗?
LLaMA
2023-03-24 22:58:16 +08:00
@aloxaf #3 确实没有,每个分隔符隔开的是纯字母数字组成的 ID 。程序会 forEach 这个 split 后的结果,然后 eval 每一项(每一项都会过滤掉全部非字母数字)
JonyFish
2023-03-25 02:18:40 +08:00
理论上是安全的,实际上就不好说了
oott123
2023-03-25 08:55:13 +08:00
但我还是好奇你想做什么。听着和 str.split(",").map(key => globalThis[key]) 效果一样?
proxychains
2023-03-25 09:19:29 +08:00
@Livid 1F chatgpt
learningman
2023-03-25 09:25:12 +08:00
你语言的不会是 paraeInt 啥的吧
DonDonc
2023-03-25 11:42:45 +08:00
考虑到 JavaScript 的各种神奇特性,说不定存在什么风险。
http://www.jsfuck.com/
Livid
2023-03-25 11:56:15 +08:00
@benrezzagmehamed
@proxychains

谢谢。那个使用 ChatGPT 回复的账号已经被彻底 ban 。
kkocdko
2023-03-25 17:42:17 +08:00
虽然但是,还是希望给出 x 问题。
azcvcza
2023-03-25 17:42:51 +08:00
给用户直接执行的话,只要下功夫就没有绕不过的,jsfuck,16 进制,各种奇怪的编码防不胜防
jones2000
2023-03-26 01:37:28 +08:00
把在 eval 里面执行的代码,自己做下词法,语法分析,生成 AST (抽象语法树),遍历语法树, 把有危害的操作节点都剔除掉,剩下的就是安全的。 然后再还原成 js 代码,调用 eval 执行。
jifengg
2023-03-27 08:44:38 +08:00
@DonDonc 我第一时间也想到了这个。而且,楼主还保留 字母数字和分隔符,那不是分分钟被恶意

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/926955

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX