为什么 JavaScript 中的 `eval` 被禁止使用?

JavaScript保留字:引擎词法解析的硬性边界与工程避坑指南 JavaScript保留字是语言语法的基础构件,本质是词法分析器在源码解析初期识别语句结构的关键锚点,直接影响AST生成效率与代码合法性。其设计遵循‘无歧义分词’原理,分为基础保留字、未来保留字和受限词三类,约束强度逐级递减,并随ES标准演进动态扩展——如await因async函数引入而升级为保留字,static因类静态方法语法被强化。技术价值在于保障解析确定性、防止运行时歧义、支撑现代工具链(Babel/ESLint/TS)的静态检查能力。典型应用场景涵盖变量命名、JSX属性映射、Electron跨进程脚 阅读详情

在 JavaScript 中,eval() 是一个内置函数,它的作用是将传入的字符串当作 JavaScript 代码执行。尽管它可以在某些情况下提供便捷的功能,但由于它存在多种潜在的安全隐患和性能问题,它的使用被广泛地不推荐,甚至在一些项目中被严格禁止。

为什么要禁止使用 eval()?

  1. 安全问题:

    • eval() 执行的代码是由字符串动态传入的。如果传入的字符串包含恶意代码(如跨站脚本攻击 XSS),攻击者可以借此执行任意的 JavaScript 代码,导致严重的安全漏洞。

    • 例如,如果用户输入了恶意的代码并通过 eval() 执行,它可能窃取敏感信息或执行其他恶意操作。

  2. 性能问题:

    • 使用 eval() 会让 JavaScript 引擎的优化变得困难。因为 JavaScript 引擎不能预先知道 eval() 内部代码的结构,它无法进行常规的优化手段(如代码的静态分析、内联缓存等)。这会导致代码执行的效率低下。
  3. 调试困难:

    • eval() 执行的代码不容易被调试。由于它执行的是动态生成的代码,错误跟踪和堆栈追踪也会变得复杂,使得调试和维护变得更加困难。
  4. 作用域污染:

    • 使用 eval() 执行的代码会在调用它的作用域内进行求值,这意味着它可以修改当前作用域中的变量和函数。这不仅增加了代码的复杂性,也增加了潜在的错误发生的机会。

实际项目中的 eval() 风险示例

假设你有一个在线表单,用户可以在表单中输入 JavaScript 代码并让该代码在你的应用中执行。你使用 eval() 来动态执行用户输入的代码:

function runUserCode(userCode) {
  // 用户输入的代码通过 eval() 执行
  eval(userCode);
}

const userInput = prompt("请输入你的代码:");
runUserCode(userInput);

如果用户在 prompt() 中输入以下恶意代码:

alert("This is an XSS attack!");
document.location = "http://malicious-site.com";

这段代码会被 eval() 执行,可能会引发一个弹窗,甚至导致用户被重定向到恶意网站。

代替 eval() 的更安全方案

为了避免以上的风险,现代 JavaScript 提供了多个替代 eval() 的方法:

  1. JSON 解析与字符串化:
    如果你的目标是解析 JSON 数据,不要使用 eval()。使用 JSON.parse() 和 JSON.stringify() 来处理 JSON 数据。eval() 可以解析 JSON 字符串,但它也可能执行非 JSON 内容,导致安全问题。

    // 不安全的使用
    const jsonString = '{"name": "Alice", "age": 30}';
    const jsonObject = eval('(' + jsonString + ')');
    
    // 推荐的使用
    const jsonObject = JSON.parse(jsonString);
    
  2. Function 构造函数:
    如果你确实需要动态执行某些代码,使用 Function 构造函数是更安全的选择。它不会访问外部作用域,从而减少了对当前环境的影响。

    const code = 'return 2 + 2;';
    const fn = new Function(code);
    console.log(fn()); // 输出 4
    

    与 eval() 不同,Function 只会在全局作用域内执行代码,并且没有对当前作用域的影响。

  3. 使用 setTimeout 和 setInterval:
    在某些情况下,如果需要延迟执行代码,可以使用 setTimeout() 或 setInterval(),它们允许执行字符串形式的代码,但同样存在一定的风险,因此仍需谨慎使用。

    setTimeout(() => {
      console.log('This is a delayed message');
    }, 1000);
    

示例:如何在一个真实项目中禁用 eval()

假设你在构建一个 Web 应用,且需要处理用户输入的数据。如果你不对用户的输入进行任何过滤或清理,使用 eval() 就会带来很大的安全隐患。为了避免这种情况,采用更安全的处理方式,例如:

// 不安全的做法
function executeUserCode(userCode) {
  eval(userCode); // 存在安全隐患
}

// 安全的做法
function executeUserCodeSafely(userCode) {
  try {
    const result = new Function('return ' + userCode)();
    console.log(result);
  } catch (error) {
    console.error('Error executing user code:', error);
  }
}

在这个示例中,Function 构造函数比 eval() 更安全,因为它不访问当前作用域中的变量,而且能够隔离用户代码的执行环境。

总结

  • eval() 虽然有一定的灵活性,但由于其带来的安全风险、性能问题和调试困难,通常不推荐在生产环境中使用。
  • 在实际开发中,应尽量避免使用 eval(),并通过替代方案(如 JSON.parse()、Function 构造函数等)来完成相似的功能。
  • 如果不可避免需要动态执行代码,请确保严格的输入验证和清理,避免执行用户输入的恶意代码。
JavaScript eval函数的深入探索与应用实践 本文还有配套的精品资源,点击获取 简介:在JavaScript编程中,eval函数是一个能够将字符串作为代码执行的特殊函数,常用于处理动态代码或解析JSON。但由于安全性和性能问题,其使用需谨慎。本文通过"Tiny"项目案例,探讨了eval函数的工作原理、安全风险以及在实际场景中的应用策略,如在HTML环境中的动态DOM创建和数据处理。此外,文章也指出开发者应尽量避免使用e... 阅读详情

相关推荐

解决ADS1.2报错Cannot obtain license

报错如下 将licenses文件下的license内容进行修改: 修改为如下内容即可。 # # Generated on 2021-dec-1 by licwizard # PACKAGE ads armlmd 1.200 E32F0DE5161D COMPONENTS="armasm compiler bats armulate axd adwu fromelf armlink codewarrior armsd" INCREMENT ads armlmd 1.200 permanent uncounte

qq_46110320的博客 3463

提示工程与XSS防御:架构师如何通过安全提示词生成安全代码

跨站脚本攻击(XSS)是一种常见的Web安全漏洞,攻击者通过注入恶意脚本,在用户浏览器中执行,从而窃取数据或进行其他恶意操作。其原理在于Web应用未对用户输入进行充分验证和输出编码,导致不可信数据被当作代码解析。防范XSS对于保障应用安全至关重要,尤其在当前大模型辅助编程兴起的背景下。通过提示工程,架构师可以将安全原则前置,在需求描述阶段即嵌入XSS防御要求,引导AI生成具备输入验证、输出编码和内容安全策略(CSP)等安全特性的代码。这种方法将安全思维融入开发全流程,从源头降低漏洞引入风险,适用于需要快速生

weixin_34236869的博客 371

ACPWorkbench_for_BP10

ADC支持9种采样率:8000Hz、11025Hz、12000Hz、16000Hz、22050Hz、24000Hz、32000Hz、44100Hz 以及 48000Hz。选择5种MCLK源时, 模块内部的MCLK源无效。I2S 采样率支持:8K,11.025K,12K,16K, 22.05K, 24K, 32K, 44.1K, 48K, 88.2K, 96K, 176.4K 和 192K。DAC采样率支持:8K,11.025K,12K,16K,22.05K, 24K, 32K, 44.1K和48K。

dddds222_的博客 4560

js函数eval()

eval() 是 JavaScript 中的一个全局函数,它可以将传入的字符串当作 JavaScript 代码来执行。其中,string 是要执行的 JavaScript 代码字符串。eval() 函数会返回最后一个表达式的结果。

温暖前端的博客 5121

用Spirent Test Center测试交换机Head of Line(HOL)Blocking

测试目的:设备执行拥塞控制,使非阻塞端口不受阻塞端口影响 预设条件:在RFC2889里按以下步骤设置,端口1和端口3同时向端口4发送数据包,端口1向端口2发送数据包 测试步骤:运行设置好的RFC2889 测试结果:所有frame size都显示没有Head of Line(HOL),即非阻塞端口不受阻塞端口所影响 ...

Yuna_的博客 1357

Cursor概述及环境配置

Cursor 是一款基于 AI 的代码编辑器,支持 VS Code 配置迁移和 Java 开发环境配置。主要功能分为 Cursor Settings(AI 相关设置)和 Editor Settings(基础编辑器设置)。用户可通过一键导入或手动方式迁移 VS Code 配置,配置包括主题、扩展和快捷键等。对于 Java 开发,需配置 JDK 和 Maven 路径,并安装 Java 扩展插件以获得完整开发体验,如代码补全、调试和 Maven 项目管理。此外,Cursor 支持汉化配置,用户可安装中文语言包切换

Knight 3556

JavaScript 之 eval 详解

其实即便带有变量,JavaScript也是可以直接计算的,但是如果你现在只想声明一个带有变量的表达式,但是想稍后进行运算(你有可能在声明这个带有变量的运算式之后还有可能对里面的变量进行修改),就可以使用eval。比如,假如你有一个变量 x ,你可以通过一个字符串表达式来对涉及x的表达式延迟求值,将 “3 * x + 2”,存储为变量,然后在你的脚本后面的一个地方调用eval()。eval()的运行效率也普遍的比其他的替代方案慢,因为他会调用js解析器,即便现代的JS引擎中已经对此做了优化。

subsistent的博客 2178

【智能机器人开发全流程:硬件选型、软件架构与ROS实战,打造高效机器人系统】

通过模块化设计与ROS框架的灵活扩展,可快速搭建适应不同场景的机器人系统。实际开发中需重点关注。

dally2的博客 6038

JavaScript危险函数|eval()函数

描述 eval()是全局对象的一个函数属性 eval()的参数是一个字符串,如果字符串表示的是表达式,eval()会对表达式进行求值,如果参数表示一个或多个JavaScript语句,那么eval()就会执行这些语句,不需要用eval()来执行一个算术表达式:因为javascript可以自动为算术表达式求值 如果你以字符串的形式构造了算术表达式,那么可以在后面用eval()对他求值,例如,假设你有一个变量x,你可以通过将表达式的字符串值(例如3*x+2)赋值给一个变量,然后在你的代码后面的其他地方调用e

qq_60115503的博客 6201

电磁炉线圈加热仿真全流程:用Ansys Maxwell分析涡流效应与热损耗

本文详细介绍了使用Ansys Maxwell进行电磁炉线圈加热仿真的全流程。通过构建2D轴对称涡流场模型,深入分析了高频下的涡流效应、趋肤效应与热损耗分布,为优化线圈设计、提升加热效率与均匀性提供了量化依据和实用指南。

sss66的博客 966

别再只会复制Haar级联代码了!OpenCV人脸检测全方案深度解析,从原理到工业级落地

通用预训练模型在你的业务场景效果不好时,用自己的业务数据集训练专属的级联器,是提升精度的终极方案,OpenCV自带和工具,支持自定义Haar/LBP级联器训练。场景首选方案次选方案新手入门学习Haar级联分类器LBP级联分类器嵌入式轻量固定场景LBP级联分类器YuNet轻量版工业级落地项目(99%场景)DNN+YuNetMTCNN多人脸+小目标复杂场景DNN+YuNet自定义微调模型同时做人脸+其他目标检测。

2601_94871597的博客 380

JavaScript高手进阶:详解Eval加密

在JavaScript编程中,涉及到代码加密,在混淆加密时代之前,用的最多的应该是种Eval加密。 加密后的特征是以:eval(function(p,a,c,k,e,r)为代码开始,相信很多人都见过这种代码。 Eval加密效果例程: 这是一种非常古老的技术。早在约2004年,一名南非的JavaScript程序员dean.edwards发明了这种加密技术。 本文将探索该加密技术的实现原理,并给出解密方法。 首先,直接上源码,该源码为Eval加密的变种,加密效果一样。 Eval加密完

w2sft的博客 2865

Qt垂直滚动条QVerticalScrollBar详解:从基础到实战的控件开发指南

本文系统解析Qt中QVerticalScrollBar的用法,从基础概念到进阶技巧。主要内容包括:1)基础认知:介绍其继承关系、作用及典型应用场景;2)核心用法:创建方法、关键属性配置和信号槽连接;3)进阶技巧:自定义样式表美化外观,以及与自定义内容区域的联动实现;4)实战注意事项,如避免循环触发和高DPI适配等。文章强调掌握QVerticalScrollBar对提升Qt滚动类功能开发效率的重要性,并建议通过自定义文本编辑器实践巩固知识点。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 759

es6删除对象的属性_JavaScript从零开始——面向对象编程(6)

把严格模式放在这里可能有点偏题了,不过鉴于它仍然在实际应用当中有其积极的意义,就在这里看看它:除了正常的运行模式,JavaScript 还有第二种运行模式:严格模式(strict mode)。顾名思义,这种模式采用更加严格的 JavaScript 语法。同样的代码,在正常模式和严格模式中,可能会有不一样的运行结果。一些在正常模式下可以运行的语句,在严格模式下将不能运行。1 设计目的早期的 Java...

weixin_42327688的博客 411

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JS常见反调试

Object.toString() 如果控制台输出的是对象,则保留对象的引用,每次打开开发者工具的时候都会重新调用一下对象的 toString()方法将返回结果打印到控制台(console tab)上。Function.prototype.constructor.toString = Function.prototype.constructor_.toString(做保护)console.log = function(){} 或者一直调用clear方法,禁止了控制台的输出。2.基于dom(页面)

qq_74893273的博客 654

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【Web】控制台操作

浏览器控制台重定向空白页面使用``调用函数eval()执行函数命令使用时间类函数执行代码通过匿名function()执行脚本创建Function对象并执行代码通过apply执行代码通过call执行函数通过成员对象执行函数通过top执行函数通过WINDOW.WINDOW或任何等价值执行函数通过页面事件执行代码通过ANCHOR属性执行代码通过页面重定向执行代码通过window.open执行代码通过Array.prototype.filter回调执行代码通过Array.prototype中其他函数执行代码(1)通

share something here 2332

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

AI编程助手深度定制指南:AGENTS.md规则文件编写与实战

这次我们来看一个对 AI 编程助手进行深度定制的核心技能:AGENTS.md 规则文件。很多开发者在使用 Codex、Claude Code、Cursor 或 GitHub Copilot 时,可能已经安装了各种“技能包”,但发现效果时好时坏。问题的关键往往不在于安装了多少技能,而在于你是否真正理解并掌握了那个控制 AI 行为的“指挥棒”——AGENTS.md 文件。 AGENTS.md 是定义 AI 编码助手行为、风格和能力的核心配置文件。它本质上是一份高级指令集,告诉 AI 在你的项目中应该如何思考、如

weixin_33889665的博客 409

AI驱动的语义化漏洞挖掘:从传统SAST到智能代码审计的范式革命

静态应用程序安全测试(SAST)和模糊测试(Fuzzing)是传统软件安全测试的核心技术,它们通过规则匹配和异常数据输入来发现潜在漏洞。然而,这些方法常面临误报率高、代码覆盖率不足和难以发现复杂逻辑漏洞的瓶颈,其根本原因在于缺乏对代码语义的深度理解。随着大语言模型技术的发展,AI驱动的语义化代码审计正在重塑漏洞挖掘范式。通过构建抽象语法树(AST)和追踪数据流,AI能够像安全专家一样理解代码意图和逻辑,实现从“模式匹配”到“语义推理”的跨越。这种技术不仅能高效识别SQL注入、命令注入等常见漏洞,更擅长发现传

weixin_33725515的博客 430

【JavaScript】eval

是一个全局函数,它接受一个字符串参数,并将其作为 JavaScript 代码进行解析和执行;如果接收的不是一个字符串,则会将传入的数据直接返回。JavaScript 中的。不推荐使用 eval。

小秀的博客 638

JS中的 eval

在 JavaScript 的世界里,eval 是一个极具争议的函数。它拥有强大的能力,但也被许多人视为“邪恶”的存在。今天,我们就来深入探讨一下 eval,看看它究竟是什么,为什么它如此危险,以及为什么在现代编程中我们应该尽量避免使用它。

前端小巷子的博客 738

JavaScript函数eval的详细讲解

是一个JavaScript函数,它用于将包含 JavaScript 表达式的字符串作为参数,并执行这些表达式。它可以用于动态地执行代码,但它也可能导致安全性问题和代码可读性问题,因此在使用时需要小心谨慎。是一个功能强大但潜在危险的JavaScript函数,应谨慎使用,尤其是在处理不受信任的数据或用户输入时。一般情况下,最好避免使用它,除非没有其他合适的替代方法。函数的主要功能是将字符串中的 JavaScript 代码解释并执行。例如,使用函数或条件语句来执行动态逻辑,而不是执行动态生成的代码字符串。

weixin_42279822的博客 731

JavaScript eval() 函数

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

Developer of XingKong22star 2542

js的eval函数

eval() 是 JavaScript 中的一个内置函数,用于将传入的字符串当作 JavaScript 代码执行。

xiaohua0708day的博客 1466

JavaScript-eval函数

eval函数是 JavaScript 中的一个内建函数,它用于执行以字符串形式传递的 JavaScript 代码。虽然eval具有强大的灵活性,但它的使用通常被认为是不安全的,因为它可以执行任意的代码,包括恶意代码。因此,在实际开发中,应该避免使用eval,特别是当处理用户输入时。

__猫玖__的博客 750

禁用eval函数

(PHP 4, PHP 5, PHP 7) 无论是linux服务器还是windows服务器,eval命令是非常危险的 一、如何禁用eval命令 在php.ini中这样设置disable_functions =eval是无法禁用eval的,根据php手册说明,eval是一个语言构造器而不是一个函数。如果要禁用eval,则需要第三方扩展,使用Suhosin linux下suhosin的安装: wg...

weixin_44706754的博客 2845

javascript 中的 eval() 函数

// 场景再现:后端返回数组中某个字段为以逗号分割的字符串(列举三条为例,实际开发中公式不固定) // 以第一条数据为例:data:'10,你好,20,hello,6,hi,(B-A)*3-C,'; // A的值为10,B的值为20,C的值为6,要求以(B-A)*3-C为公式进行计算,将计算结果放到最后一项并进行列表渲染

Story_0809的博客 1095
上一篇: 如何优化 JavaScript 中的 DOM 操作?
下一篇: 如何在 JavaScript 中使用时间戳?
疯狂的沙粒
博客等级 码龄12年 1万+粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂的沙粒

您的鼓励是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值