V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LLaMA
V2EX  ›  信息安全

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

  •  
  •   LLaMA · 2023-03-24 20:17:58 +08:00 · 1856 次点击
    这是一个创建于 615 天前的主题,其中的信息可能已经有所发展或是发生改变。
    14 条回复    2023-03-27 08:44:38 +08:00
    hellohy
        1
    hellohy  
       2023-03-24 21:37:01 +08:00
    即使您使用正则表达式过滤掉所有非字母数字和分隔符的字符,JavaScript 仍然存在恶意代码被执行的风险,因为恶意代码可以使用各种技巧来绕过这种过滤。

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

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

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

    谢谢。那个使用 ChatGPT 回复的账号已经被彻底 ban 。
    kkocdko
        11
    kkocdko  
       2023-03-25 17:42:17 +08:00 via Android
    虽然但是,还是希望给出 x 问题。
    azcvcza
        12
    azcvcza  
       2023-03-25 17:42:51 +08:00
    给用户直接执行的话,只要下功夫就没有绕不过的,jsfuck,16 进制,各种奇怪的编码防不胜防
    jones2000
        13
    jones2000  
       2023-03-26 01:37:28 +08:00
    把在 eval 里面执行的代码,自己做下词法,语法分析,生成 AST (抽象语法树),遍历语法树, 把有危害的操作节点都剔除掉,剩下的就是安全的。 然后再还原成 js 代码,调用 eval 执行。
    jifengg
        14
    jifengg  
       2023-03-27 08:44:38 +08:00
    @DonDonc 我第一时间也想到了这个。而且,楼主还保留 字母数字和分隔符,那不是分分钟被恶意
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1110 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:22 · PVG 03:22 · LAX 11:22 · JFK 14:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.