为什么我不应该让外人访问我的数据库?

时间:2009-10-13 12:25:43

标签: database security api architecture

今天有很多网站都有API,允许用户使用GET HTTP请求以XML或JSON的形式从网站获取数据。 Flickrdel.icio.us是包含API的网站示例。这些API要求服务器访问数据库,然后将结果输出为XML或JSON。

为什么我们需要这个翻译呢?为什么不在数据库上创建用户(例如MySQL)?将为用户提供对数据库的有限访问权限,仅允许SELECT,并且仅允许这些表中的某些表和某些列。这对于服务器来说不是更有效率(它不必处理HTTP请求),对于现在可以按照需要的方式准确访问所需数据的开发人员来说会更容易。

10 个答案:

答案 0 :(得分:32)

除了安全注意事项,您可以在不影响客户端的情况下更改数据库结构。此外,格式不正确的查询会占用您的服务器,而不是客户端。

答案 1 :(得分:28)

您能否阻止恶意个人制作超级复杂的SQL查询,将数据库的CPU固定在100%?你能阻止很多无辜的程序员编写那些永远不会被优化的低效查询来做同样的事情吗?

答案 2 :(得分:11)

API:

  • 使监控和控制使用变得更容易(为数据库用户实施“每X有限查询”可能更难)
  • 允许向用户呈现比DB中使用的更简单的结构。
  • 表示用户无需了解您的数据库结构。
  • 允许数据库移植。 (哦,你已经变得越来越大,现在需要实现:分片,移动到bigtable等等 - 使用API​​,用户不需要知道)
  • 允许不同的(更好的?/变量?)缓存请求。
  • 意味着您无需为额外的数据库用户付费(如果这是数据库的许可方式。)

答案 3 :(得分:10)

编码合同 - 使用API​​,您可以更改其背后的所有内容,而不会影响外人使用它们。在这里,您不仅要将它们与MySQL相关联,还要将它们与您的架构联系起来

缓存 - 允许任何查询几乎消除了通过http缓存可预测查询的任何机会。这可能是消除常常排名第一的瓶颈的第一种方法,即数据库。

安全性 - 使用这种方法,即使是偶然的事情,拒绝服务攻击也很容易。更不用说您必须提供对数据层的访问权限,这通常放在可以加强安全性的受限区域中

可用性 - 并非所有人都是开发人员或想了解您的内部域名。他们可能更喜欢预先烘烤的直接和自我解释的API。一个极端的例子是为管理者提供数据库权限而不是报告。

答案 4 :(得分:3)

便携性。让我们说出于许可的原因和扩展,你做出了从MSSQL到MySql的业务决策。语法不完全相同,您的客户都必须更改其代码。

更好的做法是将其全部缓冲掉,并将实现抽象化。谁能说你没有使用训练有素的猴子在瓶盖上刮痕,坚持申请状态?

答案 5 :(得分:3)

安全是第一个原因,但我希望这些原因是显而易见的。用户使用错误查询来占用宝贵资源是另一个很好的理由。

除此之外,为什么是抽象层?

  • 您是否想要将一些日志记录添加到数据库查询以诊断速度或帮助调试?
  • 你可能会从MySQL转到MS SQL,反之亦然,除了纯ANSI之外的SQL可能会破坏吗?
  • 客户是否真的必须学习您的架构而不是更合乎逻辑的抽象?
  • 当一个新程序员学会了规范化并且现在可以看到你的整个模式包括你精心平衡的非规范化时,你是否想忍受每一个无知的批评?
  • 如果经验丰富的数据库人员指出了改进,您是否希望坚持使用旧架构?

为什么要使用API​​是一个为什么要使用抽象的问题,我的列表在这里几乎没有表面。

答案 6 :(得分:2)

Web服务器为您提供了一个可以控制的缓冲区。如果你的SQL服务器或其他什么错误,你不希望它直接暴露在互联网上。是的,如果Web服务器有bug,它可能同样糟糕......除了你在数据和世界之间有额外的层。

-don

答案 7 :(得分:1)

这不是'为什么不'而不是'为什么你应该'的问题。处理HTTP请求对于完全控制您允许或禁止用户访问的所有数据是一个小小的代价。此外,如果未来数据的性质/数量/安全级别发生变化,那么使用JSON / XML响应会比允许完全访问更好。

答案 8 :(得分:1)

当你在考虑安全问题时要记住的是,预测可能用来攻击你的所有可能的载体是非常困难的 。例如,你是否确定你已经设置了数据库权限,这样人们就不会搞砸了?

因此,您希望尝试将操作仅限于您认为合适的操作,而不仅仅是尝试限制您知道的错误。这可以通过您可以完全控制的Web服务来完成,但是很难让某人直接访问数据库并确保您是安全的。

答案 9 :(得分:0)

API是数据库周围的一种包装器。用户对数据库的内部表示没有任何了解,他只需要发送一些统一的请求并获得统一的响应。如何以及何时在服务器上处理数据 - 这不是他的头痛。