我很难理解我通常应该在检查和验证代码中操作的数据方面走多远。我在这里甚至不是说用户输入数据,我只是说我自己的数据,我知道的数据结构。例如,我可能有这样的一些基本功能:
let someData = [object];
someFunction(newData) {
let newSet = newData.frequency[0];
someData.dataset.chart.data[0].frequency = newSet;
}
假设我有一个图表使用的someData变量,然后我还有一个函数,它只是用一个新的函数更新图表数据。newData来自我的数据库(当用户调整过滤器并应用它们时(,someData是每个人看到的默认初始数据。现在,我的问题是……我预见到以下事件:
有人可能会使用开发者控制台更改someData,因此此变量将不再包含对象,或者在代码中没有我寻址的属性,因此它将导致错误并完全破坏我的逻辑。
有人可能会用非常随机的数据作为参数直接调用someFunction(再次使用控制台(,这将再次导致错误。
也许由于我这边的一些错误或其他原因,从DB接收到的newData会有点错误,或者初始someData初始化失败(因为它也是通过函数初始化的,并且依赖于第三方.JS文件,该文件也可能有一天无法加载(。
我甚至不确定我是否预见到了所有可能发生的事件。所以我的代码从你上面看到的变成了";乏味的";(在我看来(是这样的:
let someData = [object];
someFunction(newData) {
let newSet = typeof newData === "object" &&
newData.frequency ?
newData.frequency[0] : undefined;
let oldSet = typeof someData === "object" &&
someData.dataset &&
someData.dataset.chart &&
someData.dataset.chart.data &&
someData.dataset.chart.data[0] ?
someData.dataset.chart.data[0].frequency : undefined;
// Since using length on undefined will lead to an error, I've to check the type too
if (Array.isArray(newSet) && newSet.length === 5 && oldSet) {
oldSet = newSet;
} else {
throw Error("Dataset update has failed.");
}
}
即使这样也不能保证新的数据集是我期望看到的数据,因为也许我在寻找[1,2,4,5],而用户通过他的控制台等插入了["a"、"b"、"c"、"d"、"e"]。感觉我可以无休止地改进它,它永远不会是防弹的,而且最终理解我自己的代码开始变得复杂,我唯一想做的就是用新数据更改旧数据。在这一点上,我觉得我做错了。编码需要更多的时间,我甚至不确定我是否会永远这样做,但与此同时,我感觉不到何时停止过度验证我的代码的限制。请告知。
我会坚持用户输入验证。除此之外,如果他们想用开发工具把事情搞砸,那就是他们的问题。不管怎样,那些人只会站在他们一边。
重要的是服务器上的验证。客户端输入验证只是为了确保普通用户输入的所有内容在处理之前都没有错误。它还保存了发送到服务器的无用信息。服务器必须重新进行验证,因为这些人搞砸了。