微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 API Gateway 和 Lambda 函数中重复输入验证?

如何解决在 API Gateway 和 Lambda 函数中重复输入验证?

我将 OpenAPI 文件导入 API Gateway 以利用架构验证。

例如,我正在尝试验证请求正文中的电话号码:

// OpenAPI format
phoneNumber:
  type: string
  pattern: '^\d{10}$'

如果输入错误,API 网关会按预期抛出 400 错误请求。但是,当我在 Lambda 处理程序中解析 APIGatewayProxyEvent 时,我不确定是否应该在 Lambda 函数中复制相同的验证作为安全措施。如下:

import { APIGatewayProxyEvent,Context,APIGatewayProxyResult } from "aws-lambda"

export async function handleEvent(event: APIGatewayProxyEvent,context: Context): Promise<APIGatewayProxyResult> {
  
  if (event.body == null) {
    return {
      body: ..
      statusCode: 400
    }
  }
  const userInfo: UserInfo= JSON.parse(event.body);

  // Duplicate validation
  if (!isPhoneNumberValid(userInfo)) return {statusCode: 400,body: ..}; 

  return {
    statusCode: 200,body: ..
  }
}

function isPhoneNumberValid(user: UserInfo): boolean {
  const phoneRegex: RegExp = '^\d{10}$';
  phoneRegex.test(user.phoneNumber);
}

我读到不信任用户输入并在后端验证总是好的。此规则是否也适用于 API Gateway + Lambda 设置?为了调用Lambda,我必须为API Gateway 添加特定的IAM 角色策略,我不确定恶意用户如何绕过API Gateway 直接调用Lambda。

解决方法

这可能是个好主意的几个原因:

捕捉未来的错误

假设您只对那一层进行了验证,但现在它很好且正确。当然,在未来一年或更长时间的某个时间点,在您写下这个并将其交给下一个人之后,或者只是忘记它,或者设计更改之后,该验证可能会被删除。 (例如,如果有人因为它不处理国际号码而将其删除怎么办,并且处理所有这些情况的复杂性太难了,所以它就被删除了。)添加第二层可以防止意外删除。

防范未知缺陷

您不应该信任用户数据是正确的 - 始终对其进行验证。也许您的网关和 Lambda 函数之间的链接现在是安全的。但是软件有漏洞,漏洞利用可能会被发现。如果可以防止潜在的安全漏洞,添加额外的安全检查是个好主意。

它很便宜,为什么不呢?

在这种情况下,您的验证编写成本低,执行也很简单。当然,所有代码都有维护成本。但在这种情况下,它似乎并不多。在您的官方文档或评论中记录此验证发生在两个不同的位置可能会很有用。这将减少任何未来的维护成本。

额外验证的机会

OpenAPI 为数据验证提供了有限的规则集;它无法涵盖所有​​不同的微妙规则。例如,您可能想确保电话号码与用户所在的国家/地区匹配。您的 Lambda 函数可以在此处进行更深入的验证,以确保用户输入正确。

这可能是个坏主意的几个原因:

不太可能提供价值

您已经在用户可访问层进行了拒绝无效输入的验证。如果此处发生错误,则很可能是发生更大问题的结果。在另一层复制此特定验证不太可能提供重要价值。

所有代码都有开发/维护成本

需要编写涵盖有效值和无效值的单元测试。需要记录将电话号码限制为这种特定格式的逻辑。无论您的代码多么简单,最终都必须有人对其进行更新或维护。所有代码都有成本,因此将代码加倍以重复相同的功能会增加您的负担。

它不包括所有格式

不同国家/地区的电话号码格式不同。国家代码呢?如果有人使用需要分机才能联系到他们的办公室号码怎么办?如果有人使用假的 555 号码怎么办?很可能会给用户造成很大的摩擦,所以去掉就好了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?