Javascript 由于某种需求必须 eval 拼接代码执行**(不要讨论为什么)**,如果正则过滤掉所有非字母数字和分隔符,的字符,还有恶意代码被执行风险吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LLaMA
V2EX    信息安全

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

  •  
  •   LLaMA 2023-03-24 20:17:58 +08:00 2372 次点击
    这是一个创建于 998 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    PRO
       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     Solana     5516 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 01:48 PVG 09:48 LAX 17:48 JFK 20:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86