javascript - JS 最有效和安全地检查来自用户的价值,而不会得到未定义 - 使用迷你函数
问题描述
假设我想像这样检查用户的输入:
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 的情况下做同样的事情:
function value(obj, str) {
const arr = str.split('.');
for(let s of arr){
if(obj[s] === undefined)
return undefined; // Or throw error?
obj = obj[s];
}
return obj;
}
const userThing = {a: {b: {c: {d: ["something"]}}}};
console.log(value(userThing , "a.b.c.d.0"));
推荐阅读
- ios - 输入时间时显示键盘而不是仅旋转,iOS 14 Swift 5
- javascript - 如何使用javascript用超链接替换文本?
- c - 为什么 puts 函数会打印从文件中读取的最后一行并再一次存储在数组中?
- android - 已签名的 APK 网络问题 - 未签名的 apk 能够读取 API,但已签名的 apk 继续加载
- python - CSV 文件 - 如何通过用户输入替换一行数据?
- python - 我似乎找不到将滚动条添加到我的 tkinter 元素周期表的方法
- python - 机器人阅读其他用户增加了反应
- ruby-on-rails - 活动管理员表单中的 has_one 关系
- javascript - 从存储中按降序显示图像(或者我是否需要使用 Firestore)?
- c# - C# 中的正则表达式无法正常工作以进行数字检查