【问题标题】:How to prevent SQL injection and improve security on REST APIs?如何防止 SQL 注入并提高 REST API 的安全性?
【发布时间】:2021-04-08 11:06:14
【问题描述】:

我是 REST API 的新手,我正在开发一个将用于 iOS/Android/Web 应用程序的 API,但我不熟悉这些 API 在发布后面临的威胁类型。 我到处都看到这些相同的提示:

  • 使用 oAuth 2 允许交易,
  • 仅接收和发送加密的 JSON Web 令牌,
  • 使用 SSL/TTL。

我认为使用 SSL/TLS 和 JWT 应该足以确保发送/接收数据的安全性,但即便如此,如果有人窃取凭据,我还是担心 SQL 注入的可能性。

我应该检查 SQL 注入字符串 (such as this one) 的请求吗? 如果我要支持用户登录,使用 oAuth 代替 JWT 是否更有意义?

【问题讨论】:

  • 对我来说,最好的方法是区分数据传输对象 (DTO) 和数据库对象,并使用 ORM 而不是直接从后端进行 SQL 查询。这样,您可以从可预测的结构(来自 DTO)组装数据库查询,并执行基于对象的查询,从而消除 SQL 注入的风险。看看gorm
  • “和其他攻击”使这个问题变得不可能广泛......因为有无限数量的攻击(并且一直发现新的攻击)
  • 这能回答你的问题吗? How can I prevent SQL injection in PHP?
  • @symcbean 不,没有使用PHP,用例不同

标签: rest security go websecurity application-security


【解决方案1】:

sql-i

  1. 使用准备好的语句会让你获得很多好处 (further reading)

  2. 考虑使用 ORM 层与您的数据库交互(例如:gorm

安全原则

  1. 在对其执行任何操作之前始终验证用户输入

  2. 对于每个操作,如果您知道通用选项集,请选择允许列表方法与拒绝列表方法(即,如果字符串属于我的已知列表,我将只允许它通过)

授权

  1. jwt 只是一种令牌格式(类似于您的身份证),您可以将 oauth 用于底层 authz(在允许您访问某些资源之前检查您的身份证)——阅读更多 here
  2. 不记名令牌(如 jwt)应始终通过 TLS/SSL 发送,以防止入侵者访问明文 jwt (rfc7523)
  3. 随着产品的成熟,您可能希望转移到开始分配存储在手机上的会话令牌的模型,但这通常会带来处理撤销的复杂性(例如:何时/如何轮换会话令牌?)

【讨论】:

  • 好吧,假设单个对象的 GET 方法是公开的,但我们希望敏感数据和其他操作的 AAA 安全性。所有数据都将使用 TLS/SSL 传输/请求。但是为了访问或修改敏感数据,一旦用户会话提供了有效的 oAuth 令牌,API 应该发出不记名令牌(使用 JWT)?
  • @Dialvive 差不多!不记名令牌将在标头中传递;您的端点应该做的第一件事是对其执行一些 oauth-ish 授权策略检查
  • 没有理由使用 ORM 来防止 SQL 注入。如果你选择使用 ORM 是因为你想要一个 ORM,那很好,但这样做是有正当理由的。
  • @Flimzy 我认为 ORM 在操作数据库时可以帮助避免人为编写的漏洞。并且应该检查用户输入的 SQL 语法对吗?
  • 不,不应检查用户输入的 SQL 语法。它应该被引用,或者作为变量传递——那么 SQL 语法就完全无关紧要了。而且这两件事都不需要 ORM。
猜你喜欢
  • 2013-07-29
  • 2021-11-29
  • 2015-01-16
  • 2013-02-10
  • 2015-09-05
  • 2015-09-07
  • 1970-01-01
  • 2011-06-21
  • 2011-10-02
相关资源
最近更新 更多