gpt4 book ai didi

javascript - 使用 window 对象通过名称作为字符串来调用函数是否不安全?

转载 作者:行者123 更新时间:2023-11-28 16:46:57 24 4
gpt4 key购买 nike

请您告诉我,在标准网页的 JS 中,使用 window['function_name']() 通过名称作为字符串调用函数是否存在任何不安全之处?我记得很久以前读过一些关于它的内容,但现在找不到了。

我认为不使用 window 对象这样做是有原因的,因为要在 Web 扩展中调用后台脚本和内容脚本之间的函数,我总是在每个对象中声明一个不同的对象,并声明可以以这种方式作为对象的属性调用,并将函数名称作为字符串传递到通信端口中以调用它们;但我不记得为什么。

谢谢。

最佳答案

这取决于您运行代码的上下文,

<强>1。 JS执行上下文

可以使用字符串作为函数名并调用对象中相应的函数。

const functionName = "someFunction";
window[functionName]()

但是如果字符串是不受信任的数据用户可控字符串的一部分,那么使用起来不安全。即从 url 参数读取字符串。

示例:

const unTrustedUserInput  = window.location.hash
window[unTrustedUserInput]();

<强>2。网络扩展 BG 和 CS 上下文

根据chrome recommendation ,您不应该信任从内容脚本收到的消息。在执行之前,您应该始终清理输入并进行必要的验证。

因此,我建议不要将函数名称作为字符串传递,而是使用具有相应 guid 的字典映射来验证调用的是哪个函数。

示例:

// cs context

chrome.extension.sendMessage({ id: "<GUID-1>", data: "data" }, (response) => {
// handle response if any
});

// BG context
var CSBGCommunicationMap = {
"<GUID>-1": window.someFunction
}

chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) {
if (sender.id !== "<varlidate id-ur-Extension>" && sender. origin !== "<validate origin>") {
// Early return if it comes from malicious content or unknown sender
return;
}

if (message.id && message.id in CSBGCommunicationMap) {
const functionToBeCalled = CSBGCommunicationMap[message.id];
// functionToBeCalled(message, sendResponse);
}

});

我希望这能消除您的疑虑。

关于javascript - 使用 window 对象通过名称作为字符串来调用函数是否不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60445039/

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