eval() 怎么了?
Whats up with eval()?
我已经看到很多关于 eval()
函数是如何邪恶的; HTML/JavaScript 编程不是一个明智的选择。我想使用一个函数,我可以在其中传递一个字符串以将其作为变量名读取,eval()
似乎就是这样做的,但我不想使用破坏性函数。
据我了解,eval()
的问题在于它可以将第三方输入读取为实际代码,这为恶意 activity 打开了一扇门。我有一个地图元素,它使用位置名称字符串来跟踪位置。我还为变量分配了大块文本,因此我可以轻松地提取当前位置的描述。这似乎是使用 eval
的可接受时间,因为我要传递的字符串将由代码的其他部分提供。这是一个公平的判断,还是我应该使用其他一些功能?
(移动我的评论作为答案)
一个简单的解决方法是将您有兴趣访问的任何变量保存在 javascript 对象(即 key-value 对)中,并通过索引访问它们。这个简单的用例不需要 eval
.
From what I understand, the issue with eval() is that it can read third-party input as actual code, which opens a door for malicious activity.
这不是唯一的原因。有人可能会争辩说,按照今天的标准,JavaScript 代码的性能可以忽略不计。
但是,必须考虑到 eval()
实际上会调用 JavaScript 解释器,这比预先编写代码要慢得多。 ¹
I would like to use a function where I can pass in a string to have it read as a variable name, and eval() seems to do just that, but I don't want to use a destructive function.
这不保证使用 eval()
。如评论中所述,您可以通过跟踪对象中的变量来实现此目的:
let vars = {}
vars["some_variable_name"] = "test"
const var_name = "some_variable_name"
console.log(vars[var_name]) // "test"
as the strings that I would be passing in would be provided by other parts of the code
可能是,但是如果将来该代码的某些部分确实处理 一些 用户输入怎么办?
我认为不值得性能损失和明显的安全风险。
将变量名用作字符串的一种简单方法是使用对象(在某些语言中称为字典或映射)
const stringToGrade = {
"freshman": 9,
"sophomore": 10,
"junior": 11,
"senior": 12,
};
document.querySelector("#btn").addEventListener("click", () => {
const asString = document.querySelector("#inp").value.toLowerCase();
const grade = stringToGrade[asString];
console.log(`Your grade number is ${grade}`);
});
<input id="inp" placeholder="Enter your grade level (freshman, sophomore, etc.)" />
<button id="btn">Submit</button>
我已经看到很多关于 eval()
函数是如何邪恶的; HTML/JavaScript 编程不是一个明智的选择。我想使用一个函数,我可以在其中传递一个字符串以将其作为变量名读取,eval()
似乎就是这样做的,但我不想使用破坏性函数。
据我了解,eval()
的问题在于它可以将第三方输入读取为实际代码,这为恶意 activity 打开了一扇门。我有一个地图元素,它使用位置名称字符串来跟踪位置。我还为变量分配了大块文本,因此我可以轻松地提取当前位置的描述。这似乎是使用 eval
的可接受时间,因为我要传递的字符串将由代码的其他部分提供。这是一个公平的判断,还是我应该使用其他一些功能?
(移动我的评论作为答案)
一个简单的解决方法是将您有兴趣访问的任何变量保存在 javascript 对象(即 key-value 对)中,并通过索引访问它们。这个简单的用例不需要 eval
.
From what I understand, the issue with eval() is that it can read third-party input as actual code, which opens a door for malicious activity.
这不是唯一的原因。有人可能会争辩说,按照今天的标准,JavaScript 代码的性能可以忽略不计。
但是,必须考虑到 eval()
实际上会调用 JavaScript 解释器,这比预先编写代码要慢得多。 ¹
I would like to use a function where I can pass in a string to have it read as a variable name, and eval() seems to do just that, but I don't want to use a destructive function.
这不保证使用 eval()
。如评论中所述,您可以通过跟踪对象中的变量来实现此目的:
let vars = {}
vars["some_variable_name"] = "test"
const var_name = "some_variable_name"
console.log(vars[var_name]) // "test"
as the strings that I would be passing in would be provided by other parts of the code
可能是,但是如果将来该代码的某些部分确实处理 一些 用户输入怎么办?
我认为不值得性能损失和明显的安全风险。
将变量名用作字符串的一种简单方法是使用对象(在某些语言中称为字典或映射)
const stringToGrade = {
"freshman": 9,
"sophomore": 10,
"junior": 11,
"senior": 12,
};
document.querySelector("#btn").addEventListener("click", () => {
const asString = document.querySelector("#inp").value.toLowerCase();
const grade = stringToGrade[asString];
console.log(`Your grade number is ${grade}`);
});
<input id="inp" placeholder="Enter your grade level (freshman, sophomore, etc.)" />
<button id="btn">Submit</button>