免责声明:我的经验主要是使用静态类型语言进行开发,即使我了解动态类型的工作原理,我对常见实践也不是很熟悉,也不太了解通常的提示和技巧。
我最近开始在一个项目中工作,在该项目中我们使用无服务器并使用 javascript 在 AWS 中部署一些 lambda。在深入研究现有代码后,我发现了一个让我有点震惊的常见做法:
当调用 lambda 并接收到 JSON 负载时,会进行初始预处理,将对象中的所有值转换为字符串。
const mapValues = require('lodash/mapValues')
const escape = require('validator/lib/escape')
...
const body = mapValues(requestBody, value => escape('' + value))
...
然后在预处理之后,真正的工作开始(验证、处理、调用其他服务等......)
我的第一个想法是:
好处:有助于减少可能的不同类型的认知负荷,从而假设一切都将始终是一个字符串。
缺点:处理非字符串值(例如数字)的额外复杂性。
Q1:使用这种方法还有其他好处和缺陷吗?
Q2:这会被认为是一种不好的做法吗?如果是这样,为什么?(请是事实,不是观点)
提前致谢!:)
有趣的问题。我建议你问问作者他们是否有空。以下是我的一些想法:
我认为拥有字符串值不会减少但会增加认知负荷,因为在进行基本算术时您必须注意转换它们。我相信我们所有的人至少看过一次1+1
是11
。
此外,将每个数据作为字符串处理是一种非常糟糕的做法,它甚至有自己的模拟名称:字符串类型。这是这方面的食谱示例。
我能想到的唯一正当理由是防止针对服务的各种注入攻击。在某些情况下,如果允许用户发送任意 json,则可能使服务执行它通常不会执行的代码路径。(像{"__proto__":[],"length":1,"0":"foo"}
coerects一样古怪的东西,"foo"
但它是 typeof 对象,这可以绕过一些有缺陷的验证逻辑。mongodb 也容易受到一些类似的攻击)。但即使在这种情况下,正确的验证也比将每个值转换为字符串要好得多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句