解析以对象文字/JSON 语法存储为字符串的函数并区分

2024-02-22

之前有一个问题(here https://stackoverflow.com/questions/11556131/parsing-a-json-like-string-that-contains-functions),但是那里的答案并没有准确回答我的问题 - 接受的答案包含无效的 JSON(强制使用eval()),据我所知,根本不可能做这样的事情。

我计划使用我自己的服务器中的代码,该代码作为对象文字语法存储在字符串中,但是我也希望能够在其中存储函数。

目前,我想到了以下几种可能性:

  1. 只需使用eval()解析字符串
  2. 将函数以字符串形式放置(类似于"\bfunction"能够识别它们),运行JSON.parse()然后使用 for-in 循环来查看是否需要解析任何此类函数(可能非常慢)
  3. 使用 DOM 来运行代码<script>标记并在那里运行它

该代码不会包含任何应该由用户编辑的内容,但是我不确定是否仍然存在安全问题或只是速度问题。会使用eval()适合我的情况,有没有比手动解析函数或使用更有效的方法eval()?

编辑:解析的替代语法会更好还是只会让事情变得更加复杂?

EDIT2:我只想做类似以下的事情:

{ "test": function () {}
, "foo": 1
, "bar": 2 }

I'm not想要从字符串中解析整个函数,例如

eval('function(){}');

效力(他们会做他们应该做的事吗?)

1、2 和 3 都可以工作

  1. 评估responseText:这会很好地工作。如果您根据安全建议 #3 添加同源质询,则必须首先更正它。

  2. 识别对象中要“复活”的单个项目。我以前使用过这种方法,并且更喜欢使用键的命名约定来确定何时恢复,而不是值中的标记。看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse有关复兴者的描述。

    在情况 1 和 2 中,您必须以某种方式导致函数文本被解析和执行。这是您的选择。没有一个比其他的邪恶程度更小(请参阅安全部分)

    如果您使用 f=eval(responseText),则这是“直接评估”。该函数将具有调用 eval 的本地范围。

    如果您使用 f=(1,eval)(responseText),则这是“间接评估”。该函数将具有全局作用域。看http://perfectionkills.com/global-eval-what-are-the-options/ http://perfectionkills.com/global-eval-what-are-the-options/

    如果使用 f=new Function(responseText),该函数将在全局作用域下具有单独的局部作用域。

  3. 此方法称为 JSONP(用于带填充的 JSON)。它会起作用,并且可能是最容易实现的。当响应可能包含敏感的用户数据时,这也不好(见下文)。

Security(他们会不会做不该做的事?)

如果传递的消息在您的控制之下(100% 确定没有用户/攻击者可以修改它):所有选项 1、2 和 3 都不会损害用户的浏览器状态(即 XSS,例如启用窃取其 cookie 等功能)。

如果传递的消息不是 100% 当然在您的控制之下:所有方法 1、2 和 3 都会损害用户的浏览器状态并且不安全。您的选择是:

  • 接受安全风险(用户/攻击者将能够任意更改您的网站功能,包括但不限于:窃取您的用户的域 cookie、窃取用户在您的域上可以访问的任何信息、将您的用户引导至恶意软件- 受感染的页面可能会安装病毒)

  • 将潜在不安全的函数传递给网络工作者并在那里运行它们。它们将被沙箱化并且不会影响浏览器窗口。然而,这需要更多的工作,并且并非在所有浏览器中都可用。

  • 将潜在不安全的函数传递到单独域上的 iframe 中并在那里运行它们。这可以保护您用户的 cookie 等。但并不能阻止攻击者将他们重定向到利用站点来安装病毒(尽管您只能希望您的用户拥有安全的浏览器:-/)

  • 使用您控制的白名单函数,并仅传递白名单函数的名称(或工厂函数,本质上是带有一些灵活参数的白名单函数)

如果您在数据中传递用户特定信息:

  • 3 对于传递敏感用户数据来说并不安全(可以使用来自任何域的用户 cookie 轻松调用该脚本),除非您的服务器在返回响应之前对请求的引用/来源 HTTP 标头进行检查。即使这样,它也可能是不安全的。看http://en.wikipedia.org/wiki/Cross-site_request_forgery http://en.wikipedia.org/wiki/Cross-site_request_forgery

  • The naive选项 1、2 的实现以这种方式也是不安全的(即 XSRF。例如,恶意站点可以使用其 cookie 代表用户伪造数据请求,然后对其进行他们喜欢的操作)。第三方域可以重载内置的 Array 构造函数,然后插入指向 JSON 文件的脚本标记。浏览器会用用户的cookie请求这个文件,将用户的JSON返回给第三方站点,然后javascript引擎会“运行”这个JSON,这只是一条语句,但是因为Array构造函数已经被重载了,可以对数据执行任何操作,因为 javascript 会尝试在该单个 JSON“语句”中构造值

  • 为了使 1 和 2 是 XSRF 安全的,您应该放置一条如果解释为脚本会导致其中断的语句,例如无效语法或无限循环,然后您的脚本应该接收文本并修改它以消除错误。这是因为同域脚本可以在解析请求之前读取请求的responseText,而跨域脚本只能通过插入以此为源的脚本标签来访问此信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解析以对象文字/JSON 语法存储为字符串的函数并区分 的相关文章

  • 为什么我的淘汰单选按钮在另一个具有点击绑定的元素内时会失败?

    我有一个单选按钮列表 我想要点击 li 他们还检查单选按钮 这一切都有效 直到我放了一个name单选元素上的属性 然后我的代码停止工作 我的代码如下所示 ul li li ul li
  • 是否存在 IsCallable 为 false 但 IsConstructor 为 true 的 JS 对象?

    ECMAScript 规范函数可调用 https www ecma international org ecma 262 6 0 index html sec iscallable当且仅当其参数具有 Call 内部方法时返回 true 它在
  • Eslint errorring 导入没有扩展名的 jsx

    我正在尝试在 es6 中导入 jsx 文件而不需要 jsx 扩展名 import LoginErrorDialog from LoginErrorDialogView Not import LoginErrorDialog from Log
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • 如何将函数附加到弹出窗口关闭事件(Twitter Bootstrap)

    我做了一些搜索 但我只能认为我可以将事件附加到导致其关闭的按钮 https stackoverflow com questions 13205103 attach event handler to button in twitter boo
  • Chrome 扩展程序在代码中使用 client_secret

    我正在开发具有自己的 oAuth 授权的 Google Chrome 扩展 当然 我必须使用 client id 和 client secret 作为请求令牌 有什么办法可以向用户隐藏这些数据吗 由于此请求只是 javascript 源代码
  • Javascript split 不是一个函数

    嘿朋友们 我正在使用 javascript sdk 通过 jQuery facebook 多朋友选择器在用户朋友墙上发布信息 但是我收到此错误friendId split 不是函数 这是我的代码 function recommendToFr
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • 页面上使用 HTML Editor Extender 进行回发会导致 IE11 中出现 JavaScript 错误

    我已将 HTML 编辑器扩展程序添加到我正在处理的页面中 现在每当我在页面上发回帖子时 都会收到以下 Javascript 错误 JavaScript 运行时错误 参数无效 之后什么也没有发生 这在 IE10 或更低版本以及我所知道的所有其
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 对于只触及我的工作表的 Google 表格脚本,收到“此应用程序未经验证”

    我正在编写一个 Google Sheets 脚本 我只想访问与 gs 文件关联的同一电子表格中的数据 似乎我应该有权在自己的电子表格中运行脚本 但是每当我运行一个函数时 我都会得到一个This app isn t verified信息 我该
  • 在 JavaScript 循环之外声明变量可以提高速度和内存?

    C 也有类似的问题 但我们没有看到 JavaScript 的任何问题 在循环内声明变量是否可以接受 假设循环有 200 次迭代 使用样本 2 相对于样本 1 是否有性能要求 内存和速度 我们使用 jQuery 来循环 它提高了我们将 var
  • 在 Javascript 中连接空数组

    我正在浏览一些代码 我想知道这有什么用处 grid push concat row 根据我的理解 它等同于 grid push row 为什么要大惊小怪 连接 你想使用 concat当您需要展平数组并且没有由其他数组组成的数组时 例如 va
  • 带参数的事件监听器

    我想将参数传递给 JavaScript 中的事件侦听器 我已经找到了解决方案 但我无法理解它们为什么或如何工作以及为什么其他解决方案不起作用 我有 C C 背景 但是 Javascript 函数的执行有很大不同 您能否帮助我理解以下示例如何
  • Javascript Replace() 和 $1 问题

    我正在尝试创建一个脚本来搜索文本中的模式并在它找到的字符串周围包裹一个标签 shop attributes td each function this html function i html return html replace E 0
  • 从 FileReader 设置背景图像样式

    我正在寻找一种解决方案 允许我从文件上传输入中获取文件并通过设置 document body style backgroundImage 来预览它 以下代码用于在 Image 元素中显示预览 function setImage id tar
  • 在 CKEditor 中设置字体大小和字体系列

    我正在使用 ckeditor 我想问一下这个插件如何设置font family和font size 我尝试过使用 CKEDITOR config font defaultLabel Arial CKEDITOR config fontSiz
  • 如何确定所有角度2分量都已渲染?

    当所有 Angular2 组件完成渲染时 是否会触发一个角度事件 For jQuery 我们可以用 function 然而 对于 Angular2 当domready事件被触发 html 只包含角度组件标签 每个组件完成渲染后 domrea

随机推荐