假设我想像这样检查用户的输入:
if (a.b.c.d[0]=="Something")
并且用户不会发送此信息,因此我会收到未定义的错误。
函数的作用是让编程变得更容易。
所以我做了这样的事情:
function value(str) {
try {
return eval(str);
} catch(err) {
return null;
}
}
let a = {
b: {
c: {
d2: ["Something"]
}
}
}
// Now I can easy check for the incoming value;
if (value("a.b.c.d[0]"))
console.log(value("a.b.c.d[0]"));
else
console.log("No");
// this going to return "No" instead of crash the whole app
它返回良好的结果 - 返回要在 if 语句中直接比较的实际值。当未定义时,它返回null
。
由于我控制发送给此评估的内容 - 我永远不会发送危险数据 - 例如 alert('xss');
但是,我仍然担心 eval
在这里会有危险 - 会吗?
正如您所看到的,我没有将其用于用户输入,而仅用于我手动发送的字符串。
所以我的问题 - 这是确定用户输入的好习惯吗?
这个问题是关于 JS 的安全性和最佳实践。
最佳答案
您不必在这里使用eval
。您所需要做的就是在访问其子属性之前确保路径中的所有属性都存在。
这可以使用这样的东西来完成:
Boolean(a && a.b && a.b.c && a.b.c.d && a.b.c.d[0] == "Something");
此处,短路 AND 运算符 (&&
) 确保在 a.b
计算结果为 false 时不会访问 a.b.c
。因此在这种情况下代码不会抛出错误。
function checkValue(a) {
return Boolean(a && a.b && a.b.c && a.b.c.d && a.b.c.d[0] == "Something");
}
let a = {
b: {
c: {
d2: ["Something"]
}
}
}
console.log(checkValue(a));
a = {
b: {
c: {
d: ["Something"]
}
}
}
console.log(checkValue(a));
关于javascript - JS 最佳实践和安全检查用户的值,而不会出现未定义的情况 - 使用迷你函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51173365/