你的用户在骗你 不一定是故意的 说吧 您的用户可以是诚实的,恶意的,或者只是发送一些您应用程序没有预料到的东西.
你可能正在构建一个网络应用程序,一个移动应用程序,一个ML模型,一个AI代理,或者什么的,但是如果它被用户使用,那么它有某种接口和一个服务器的可能性很大.
从初学者和大学生到大公司,他们都曾有过处理不良用户输入的小故障或重大故障.
据我所知,主要原因是假设。
我们对产品用户种类作出假设,但在此过程中我们忘记了以下内容: 如果产品公开, 我们的目标受众以外的人可能也会使用, 他们可能无法信任。
甚至我们的目标受众也可能包括各种可能怀有不良意图的人, 或者可能根本不明白他们希望他们提供何种投入。
最近, 我和我的团队为我的大学开发的软件之一, 我们没有正确检查后端 假设每个人都会输入一个合适的URL。
然而,某些学生(无论出于何种原因!)进入了所需PDF文件存储在本地计算机上的路径.
这是一个无辜的和有趣的事件,没有引起重大问题,但加强了我的信念,即我们决不能对用户输入作出任何假设。
如果我不这样做会怎么样?
这可能造成的麻烦变化很大。
它只会导致请求失败, 或花费你很多钱。
因此我认为,学习如何处理不良的用户输入是非常重要的, 永远不要相信来自前端的用户输入, 并在后端处理它, 这是我现在遵循的规则, 我建议每个软件工程师也这样做。
现在,我将尝试列举一些可以帮助你写出更好的软件的良好做法、情景、错误及其解决办法。
这些问题从简单到复杂。
然而,清单并非详尽无遗,建议考虑一下你们自己的软件的不同情况。
缩略图规则:前端形式验证是必要的,但前端验证不足,包括只允许向服务器发送特定输入和输入格式.
这可以在多层进行.
以网络应用为例,第一层将是正确使用HTML属性.
例如,对于注册表格中的电子邮件字段,您可以有一个这样的标记: 另一个非常重要的层面是 程序验证您的输入,然后发送到服务器。
例如,在网络应用程序中,你可以通过JavaScript进行验证.
这包括通过regex检查格式,检查数据类型,空输入(针对需要的字段)等.
这样做极为有用,因为它通过允许更少的无用API呼叫来减少服务器上的潜在负载,因此如果输入不良,可以在请求到达服务器之前更早地被捕获,从而使用户体验更好.
然而,所有这些都可以绕过,特别是在使用浏览器开发工具的网络应用程序中.
因此是不够的。
在采取访问数据库等重要行动之前,必须对服务器进行类似的检查。
这不仅仅是通过不允许错误请求来节省服务器上的负载.
在客户端和服务器端进行适当的字符串格式检查,为SQL注射等严重攻击增加了安全层(更多读取SQL注射).
这并不总能阻止这种情况发生,但在某些情况下,这可能会成为早期捕捉者。
开始使用 schema 验证库 使用 schema 验证库 是解决这个问题的好方法。
例如Zod、Joi、Yup等, 其他编程语言