Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript `Object.fromEntries()`是否安全?_Javascript_Security_Prototype_Exploit - Fatal编程技术网

Javascript `Object.fromEntries()`是否安全?

Javascript `Object.fromEntries()`是否安全?,javascript,security,prototype,exploit,Javascript,Security,Prototype,Exploit,考虑以下JavaScript中原型污染的简单示例: 函数sayHello(名称){ log(`Hi${name}!`); } //污染原型 ({})。uuu proto_uuu.toString=()=>警报('hacked'); //触发漏洞攻击 你好({}) 我是否可以安全地将Object.fromEntries与未经检查的用户提供的数据一起使用 是的,它永远不会通过构建对象来修改对象。prototype 我很惊讶Object.fromEntries创建了一个对象,该对象的.toStrin

考虑以下JavaScript中原型污染的简单示例:

函数sayHello(名称){
log(`Hi${name}!`);
}
//污染原型
({})。uuu proto_uuu.toString=()=>警报('hacked');
//触发漏洞攻击
你好({})
我是否可以安全地将
Object.fromEntries
与未经检查的用户提供的数据一起使用

是的,它永远不会通过构建对象来修改
对象。prototype

我很惊讶
Object.fromEntries
创建了一个对象,该对象的
.toString
被利用,而
.toString
没有被利用

在这里没有什么特别之处,它只是
对象上的一个getter/setter属性。prototype
,类似于
hasOwnProperty
isPrototypeOf


您会注意到,
Object.fromEntries
确实使用自己的
\uuuu-proto\uuuu
属性构建了一个对象,并且
x.\uu-proto\uuu!==Object.prototype
(尽管仍然
Object.getPrototypeOf(x)==Object.prototype
)。继承的属性被隐藏。

您是否需要允许用户编写实际的函数以馈送到您的
对象中。fromEntries
调用?@TKoL不,只有字符串和其他对象,但我不想依赖一个假设,即使用字符串污染原型是安全的……但是
{toString:()=>警报('hacked')}
不是字符串,
“{toString:()=>alert('hacked')}”是,而且Prorbable不会有你所说的问题。如果允许数组中的任何值是IIFE,则可以使用类似以下内容进行利用:
const x=Object.fromEntries(['prop',(()=>Object.protoString=alert(‘被利用’)()]]
@Titus IIFEs不适用于我的情况,用户可以传递任意值,但不能传递要求值的代码。太棒了!非常感谢!这是否意味着我甚至可以通过调用
对象来模拟这种行为。defineProperty
我自己而不是依赖
对象。fromEntries
?如果可以,请给出一个快速示例如何以这种方式安全地使用
Object.defineProperty
太棒了,你的答案正是我想要的。非常感谢!!最后一个简短的问题,我注意到像lodash这样的库出于安全原因忽略了
\uuuuu proto\uuuuu
的设置值…你看到他们不能只使用
对象的任何原因了吗?正如你在上一篇文章中发布的那样mment?我想他们可以,但这可能意味着为了对称性,他们也需要忽略
get
ting值的继承属性,只是不希望这样。此外,“出于安全原因”,您首先要避免像其他代码一样创建这样的对象(即使是像
Object.assign
这样的本机方法)可能会与包含自己的
\uuuuu proto\uuuu
属性的对象发生错误行为。