gpt4 book ai didi

javascript - 解析以字符串形式存储在对象常量/JSON语法中的函数并进行区分

转载 作者:行者123 更新时间:2023-11-29 17:16:59 26 4
gpt4 key购买 nike

之前有一个问题(here),但是那里的答案并不能完全回答我的问题-接受的答案包含无效的JSON(强制使用eval()),就我而言,即使这样做也不可能知道的。

我打算使用来自我自己的服务器的代码,该代码以对象文字语法形式存储在字符串中,但是我也希望能够在其中存储函数。

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

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

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

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

    EDIT2:我只是想做类似以下的事情:
    { "test": function () {}
    , "foo": 1
    , "bar": 2 }

    我不是,而是 ,只是想从字符串中解析整个函数,例如
    eval('function(){}');

    最佳答案

    有效性(他们会做应做的事情吗?)

    1、2和3都可以使用

  • 评估responseText:可以正常工作。如果您根据安全建议3添加相同来源的挑战,则必须首先更正它。
  • 标识对象中要“重新生成”的单个项目。我以前使用过这种方法,并且更喜欢对键使用命名约定来确定何时恢复,而不是在值中标记。有关复活器的描述,请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse

    在情况1和情况2中,您都将不得不以某种方式导致函数文本被解析和执行。这是您的选择。没有人比其他人真正邪恶(请参阅安全性部分)

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

    如果使用f =(1,eval)(responseText),则这是一个“间接eval”。该功能将具有全局范围。参见http://perfectionkills.com/global-eval-what-are-the-options/

    如果使用f = new Function(responseText),则该函数将在全局范围内具有单独的局部范围。
  • 此方法称为JSONP(用于带填充的JSON)。它会起作用,并且可能是最容易实现的。当响应中可能包含敏感的用户数据时,这也不是一件好事(请参阅下文)。

  • 安全性(他们会不做应该做的事情吗?)

    如果传递的消息在您的控制之下(100%确保没有用户/攻击者可以对其进行修改):
    选项1、2和3都不会损害用户的浏览器状态(即XSS,例如启用诸如窃取其Cookie的操作)。

    如果所传递的消息不是100%当然在您的控制之下:所有方法1、2和3都会损害用户的浏览器状态,并且是不安全的。您的选择是:
  • 接受安全风险(用户/攻击者将能够任意更改您的站点功能,包括但不限于:窃取用户在域中的Cookie,窃取用户在域中有权访问的任何信息,将用户引导至恶意软件感染的网页可能会安装病毒)
  • 将潜在的不安全功能传递给Webworker并在其中运行它们。它们将被沙盒化,并且不会影响浏览器窗口。但是,这需要更多工作,并且并非在所有浏览器中都可用。
  • 将潜在不安全的函数传递到单独域中的iframe中,然后在其中运行它们。这样可以保护您用户的Cookie等。但不能阻止攻击者将其重定向到利用站点来安装病毒(尽管您可以希望您的用户使用安全的浏览器:-/)
  • 使用您可以控制的列入白名单的函数,并仅传递该列入白名单的函数的名称(或实质上是具有一些灵活参数的列入白名单的函数的工厂函数)

  • 如果您在数据中传递了用户特定的信息:
  • 3不能安全地传递敏感的用户数据(可以轻松地从任何域使用用户的cookie调用脚本),除非您的服务器在返回响应之前对请求的引用者/来源HTTP header 实现检查。即使那样,它还是可以认为是不安全的。参见http://en.wikipedia.org/wiki/Cross-site_request_forgery
  • 选项1,2的幼稚实现也以这种方式不安全(即XSRF。例如,恶意站点可以使用Cookie代表用户伪造对数据的请求,然后对其进行处理)。第三方域可以重载内置Array构造函数,然后插入指向JSON文件的脚本标签。浏览器将使用用户的cookie来请求此文件,将用户的JSON返回到第三方站点,而javascript引擎将“运行” JSON,这只是一条语句,但是由于Array构造函数已被重载,因此它可以做任何想要的数据处理,因为javascript试图在单个JSON“语句”
  • 中构造值
  • 为了使1和2是XSRF安全的,您应该放置一条语句,如果将其解释为脚本(例如无效的语法或无限循环),则该语句将导致其中断,然后您的脚本应接收文本并对其进行修改以消除错误。 。这是因为同域脚本可以在解析请求之前读取请求的responseText,而跨域脚本只能通过插入带有此标签作为源的脚本标签来访问此信息。
  • 关于javascript - 解析以字符串形式存储在对象常量/JSON语法中的函数并进行区分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16767431/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com