对客户端 JavaScript 计算器使用 eval 安全吗?

2024-05-20

我正在制作一个计算器,作为用户浏览器的静态 HTML 页面。该页面并非旨在将任何信息提交回服务器。除了这个计算器之外,网页上不会出现任何其他内容。

在这种情况下使用“eval”安全吗?或者换句话说,在这种情况下使用 eval 是否会导致额外的安全风险?

对我来说,用户似乎无法通过简单地打开浏览器开发工具来对此页面做任何邪恶的事情。我一直读到“从不”使用 eval,但在这种情况下,它似乎很有意义。

这是一个计算器示例:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Calculator</title>
</head>

<body>
    <input id="input" type="text">
    <button onclick="{
        let result= '';
        try {
            result = eval(document.getElementById('input').value);
        } catch (error) {
            result = error;
        }
        console.log(result);
        document.getElementById('result').innerHTML=result;
        }">calculate</button>
    <div id="result">result here</div>
</body>

</html>

它可能会打开页面以执行任意代码。考虑一下是否有人设法说服您的一个或几个用户:“尝试将其粘贴到输入字段中。您不会相信接下来会发生什么!”如果你保存的话这是一个很大的潜在问题any客户端上与用户相关的数据 - 例如 cookie 中的登录凭据,或本地存储或 IndexedDB 中的数据等。

即使您不存储任何此类数据,清理输入值以使其仅包含数学表达式而不包含其他内容也可能是个好主意。例如,只允许您想要的数字和运算符可能很简单+-*/。这很容易做到,而且很安全,所以你应该这样做。

另外,不要将函数放入内联处理程序中(或根本使用内联处理程序) - 这是非常糟糕的做法。正确使用附加事件监听器addEventListener.

document.querySelector('button').addEventListener('click', () => {
  const sanitizedValue = document.getElementById('input').value
    .replace(/[^-+/*\d]/g, '');
  try {
    document.getElementById('result').textContent = eval(sanitizedValue);
  } catch(e) {
    document.getElementById('result').textContent = 'Syntax not correct';
  }
});
<input id="input" type="text">
<button>calculate</button>
<div id="result">result here</div>

.replace(/[^-+/*\d]/g, ''); does:

  • Match any character that is not:
    • -, +, /, *
    • Or \d(任意数字)
  • 将所有此类匹配的字符替换为空字符串
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对客户端 JavaScript 计算器使用 eval 安全吗? 的相关文章

  • 今天(儒勒·凡尔纳)的 Google 涂鸦是如何运作的?

    相信很多人都已经看过今天的了 2011 02 08 谷歌的涂鸦 http www google com logos verne html 如果涂鸦发生变化 请链接到 CNN 上的文章 http edition cnn com 2011 TE
  • $(window).resize() 和打印预览模式

    我有一段非常简单的代码 可以在调整大小后刷新窗口 window resize function location reload 当我尝试在 Chrome 中打开打印预览模式 Ctrl P 时 它也会刷新它 有什么想法如何避免这种行为吗 要确
  • 从 javascript 调用 HttpHandler

    我有一个简单的页面 带有通过 JavaScript 调用 HttpHandler 的按钮 HttpHandler 获取大量文件并将它们添加到 zip 文件中 完成工作后 zip 文件将添加到 Response 中 此操作可能需要几分钟时间
  • 具有动态过滤标准的 JS Array.filter

    如何动态声明一组过滤条件而无需指定过滤器的数量 例如 如果我有一组数据 如下所示 var data item type wood size 10 item type wood size 8 item type metal size 8 我知
  • jQuery 插件与小部件

    几个月前 我开始使用 jQuery 插件进行一些实验 我在互联网上找到了一些教程 然后开始整理一些东西 几天前 我需要构建自己的 插件 并回到我的旧项目 当我试图在互联网上找到更多信息时 我偶然发现了这些称为小部件的新 东西 据我了解 我应
  • Scalatest PlusPlay Selenium 无法调整窗口大小

    对此已经研究了一段时间 我似乎找不到使用 scalatest plus 调整窗口大小的方法 我发现在线搜索或文档的唯一方法http doc scalatest org 2 1 5 index html org scalatest selen
  • 数字和数字对象有什么区别?

    存储在普通变量中的数字有什么区别 var foo 5 和一个数字对象 var bar new Number 5 数字对象可以用来做什么 A Number对象包含一些有用的方法和属性 例如 数字对象方法 Method Description
  • 如果重复,则从数组中删除两个值 - JavaScript/jQuery

    我这里有一个数组 var myArr 1 1 2 5 5 7 8 9 9 现在我想删除重复的两个外观 所以想要的结果是not var myArr 1 2 5 7 8 9 but var myArr 2 7 8 基本上我知道如何删除重复项 但
  • 在 JavaScript 中对数组进行排序

    我正在尝试对内部包含整数的数组进行排序 例如 var array 123 3 745 4 643 5 643 2 我如何对其进行排序才能返回类似以下内容的内容 array 745 4 643 2 643 5 123 3 您可以将自定义比较函
  • d3js v5 + Topojson v3 关于加入 csv 和 json 的优化

    为了制作地图 我需要将一些值从 csv 导入到 json直接在代码中 为了加载 json 和 csv 文件 我使用 Promise 对象的异步操作 并使用两个循环和一个公共键在 json 文件上添加新属性 for var i 0 i lt
  • 如何使 CSS 样式覆盖 JavaScript 应用的样式

    我动态创建一个 HTML 表 并应用一些样式 var tbl document createElement table tbl id CrewMemberTable document getElementById CrewMemberPan
  • React Native 中循环 Json 并显示

    How do I go about looping the result i retrieved from Json render function console log this state list contents
  • 过滤文件上传仅用于文本文件

    我使用的是 Firefox 版本 14 0 1 我需要过滤上传文件窗口以仅显示 txt files 我的浏览器不仅仅支持文本文件 text plain 我可以通过指定此格式来限制图像文件 image 但我只需要过滤文本文件在文件选择器窗口中
  • Symfony2 Secure by IP 不起作用

    在我的 Symfony 2 3 1 Security YML 中 我有这一行 安全 yml access control path mysecurearea roles IS AUTHENTICATED ANONYMOUSLY ip 0 0
  • 如何对基于 HTML5-JavaScript 的视频播放器进行快照?

    实际上 我有一个带有 JavaScript 函数的 HTML5 页面 可以让我播放 wmv 视频文件 我需要在视频播放时 有暂停或没有暂停 拍摄快照并以任何图像格式 JPG 或 BMP 保存 任何帮助将不胜感激 谢谢
  • 在 Photoshop 中使用 javascript 修改文本项的内容

    我知道如何使用这样的代码在 Photoshop 中设置文本项的内容 var al doc activeLayer if al kind LayerKind TEXT get the textItem var ti al textItem c
  • React:在哪里扩展对象原型

    我使用创建了一个纯 React 应用程序创建反应应用程序 https github com facebookincubator create react app 我想延长String类并在一个或多个组件中使用它 例如 String prot
  • 是否可以对 Flexbox 插入、删除和项目位置进行动画处理?

    这个问题最初是在 2012 年提出的 https stackoverflow com questions 11106876 is it possible to animate flexbox inserts removes但是提供的答案并未
  • 只允许在输入字段中输入数字

    我想要打开电话号码字段这个网站 http myfrugaltech com dev savoo register 只接受数字或数字 我无权编辑 HTML 代码 那么可以使用 jQuery 通过定位字段 ID 来完成此操作吗 如果可以的话 该
  • 解析函数是否异步传递给 Promise 执行器?

    我有以下代码 function myPromiseFunc return new Promise resolve gt resolve Promise resolve 123 据我们所知Promise resolve方法立即用普通值解析 P

随机推荐