【问题标题】:Secure way to sanitize an object (javascript)?清理对象的安全方法(javascript)?
【发布时间】:2022-01-05 17:03:06
【问题描述】:

为了避免 JavaScript delete 运算符 (ref:https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/delete) 我目前正在使用对象解构来摆脱私有属性:

//sample helper-function in ts

const sanitizeUser = (user: User): UserSanitized => {
                const { googleData, ...rest } = user
                return rest
            }

我的问题是,返回值sanitizeUser 是否可以安全使用,而无法恢复googleData 属性。

【问题讨论】:

  • 是的,此函数将剥离 googleData 属性并返回不存在 googleData 属性的对象,除非 TypeScript 转译器中存在任何类型的漏洞。
  • 为什么用户可以对所述对象进行任意操作?您是否将其传递给某些沙盒上下文,允许用户提交的代码在其中运行,或者发生了什么?

标签: javascript typescript delete-operator


【解决方案1】:

您可以确定sanitizeUser 返回的对象不具有googleData 属性。这可能意味着没有办法从“净化”对象中获取该属性的值,但这完全取决于User 对象。如果User 对象有任何引用它的属性(有时是父/子关系的情况),那么sanitizeUser 返回的净化对象也将具有该属性 - 它仍然会引用原始User 对象,因此可以通过该属性访问googleData。

这是一个使用等效 JavaScript 代码的示例:

const sanitizeUser = (user/*: User*/)/*: UserSanitized*/ => {
    const { googleData, ...rest } = user;
    return rest;
};

const user = {
    googleData: "secret data!",
};
user.self = user;

const sanitized = sanitizeUser(user);
console.log(sanitized.self.googleData); // "secret data!"

但是,如果User 对象没有任何(直接或间接)引用自身的东西,那么不,经过清理的对象很好,并且无法从它返回到googleData 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 2013-12-18
    • 1970-01-01
    • 2012-05-24
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多