2013-05-04 50 views
1

我正要进入一个SAAS项目,我已经组建了一个小团队来生产。在大多数情况下,我们已经将所有功能都明智地计划出来,但我正处于需要考虑数据库体系结构和安全问题的地步。SAAS启动数据库架构和安全考虑

是否有任何安全问题与正常的Web应用程序项目不同,因为您可能会有数百个用户?至于数据库,我一直在阅读关于数据库设计的文章,我想我会用一个单一的数据库来处理所有事情,但是我想知道这样会不会变慢?假设你有一个“客户”表,其中有30,000条记录。对于每个客户来说,加载比为数据库分配还要慢吗?

此外,注册和我的客户信息应该与实际的SAAS应用程序在同一个数据库上。换句话说,如果一个进入我的网站并申请免费试用的用户进入一个数据库,而他的所有团队和客户等都进入了实际的产品数据库,还是应该只是一个数据库?

潜入此之前有什么其他考虑事项?我将在Codeigniter框架上构建它。

回答

4

这里的一些想法:

安全

你会得到了更多关注潜在的黑客具有更大的用户群,但除此之外,你的安全问题应该是大致相同的,为最部分(只是发现和利用安全缺陷的人的机会和后果要高得多)。

我不知道您已经知道了多少Codeigniter,但它内置了一些安全功能。还有一些您希望用于任何网站的一般安全功能。

  • Consider enabling CI's cross-site scripting protection
  • Consider using CI's Database Sessions
  • 使用CI的Active Record的DB类正确,以避免MySQL的注入漏洞
  • 确保您散列和盐密码(每用户盐是好的,也能确保你的哈希算法是安全的 - 也就是说,不是MD5)
  • 还要确保其他任何机密内容都以某种方式进行了加密 - Codeigniter有一个用于此目的的库,只要您在服务器上支持mcrypt即可。
  • 确保正在过滤用户输入以防止XSS(跨站点脚本攻击)攻击。笨有一个特点,可以尝试将这些过滤掉,但它不落实得非常好
  • 确保权限检查水密,所以没有办法,用户可以访问不属于他们的信息
  • 每个IP限制每小时执行某种登录尝试的

性能

我没有任何坚硬冰冷的数字给你来这里,但绝对看确保所有适当的字段建立索引,因为表格扫描可能会变得非常慢ger行数。

避免对数据进行过度标准化 - 有时在多个地方存储相同的数据会更好。然后,您在更新数据时会遇到性能问题,但在读取数据时可能会节省连接时间。

如果有机会使用数据库触发器,那就去吧 - 它比让Web应用程序向数据库发送几个查询来完成同样的事情要快得多。

如果您将免费试用帐户隔离到另一个数据库,它将有助于保持与试验数据不同的“真实客户数据”(并且更容易说明,仅对非试用数据进行perofrm自动备份)。从基础设施的角度来看,如果您希望将免费试用服务和常规服务转移到单独的系统上,它也会使其更容易。

虽然没有太多的数据库,但请记住,每次推送更新时,都需要确保每个数据库模式都是最新且最令人满意的。如果您拥有数百个客户端数据库,则任何类型的非自动化管理都很容易变成噩梦。

+0

我真的很感激你把这个答案。好东西。我几乎和你在一起,已经做了所有提到的安全性的东西,所以这很好。您可以详细说明或向我发送正确的方向,以了解有关“数据库触发器”和“过度标准化”数据的更多信息。谢谢!!! – 2013-05-05 02:13:05

+0

@DanielWhite您可能会发现这些链接很有用:http://www.codinghorror.com/blog/2008/07/maybe-normalizing-isnt-normal.html和http://www.sitepoint.com/database-triggers -events / – 2013-05-06 11:11:10

0

一件大事使用一个单一的数据库为SaaS应用程序时要考虑:

  • 添加帐户ID给所有的表。
  • 请始终在您对数据库的所有查询中使用accountid。否则,您最终可能会混淆账户之间的数据。

此外,在决定对审判账户和付费账户独立的数据库,想想当试用帐户转换到付费帐户会发生什么了。他们一定会想要保存所有的数据。你打算将所有数据从试用版数据库移到付费数据库吗?

0

根据我对SaaS的经验,最好将数据保存在每个访问的相同数据库中。如果你使用的是MySQL,每个数据库在任何时候都可以打开多少个表是有限制的。如果你使用了大量的数据库和大量的表,你会遇到内存和I/O问题。我记得有一个项目我们每个客户端有1个数据库,并且在10个客户端(每个30〜40个表)后,我们在4GB服务器上达到了内存限制。

就像威廉说的,如果可能的话,你想避免过度归一化。您可能希望在对象属性可能的情况下实现EAV表,例如在每个客户端可能具有不同的每个站点配置的用户表上。用户角色,用户组等等相同。如果您正在构建电子商务功能,则一定要使用EAV。对于普通网站,3NF可以;大多数重复的数据被分离出来,并与外键链接在一起,这样就不会有20 - 30列的表格。对于SaaS应用程序,您可能需要将其升级到4NF的BCNF,以便您可以增加应用程序的灵活性。

网站/应用测定:

显示所使用的URL正确的网站这是非常重要的。最简单的形式是使用XML/JSON文件,并根据请求扫描XML文件以匹配URL。尽可能将其缓存在内存中,因为您会发现每个新网站的流量都会有线性增长。如果你有3个网站,你将有3倍的流量到一个应用程序,而不是分散在三个不同的应用程序。

安全:

这取决于安全的,你需要的水平。如果你需要一个SSL证书,你可以逃避购买共享服务器证书,如果你打算从同一个IP地址托管所有网站。如果每个站点都想要自己的SSL,那么您将不得不适应不同的站点IP。那时你需要映射URL => IP。

基于用户的安全性与显示正确的网站一样重要。您需要确保您正在检测基于注入的攻击。您可以利用内置的CI功能,但为了安全起见,您应该自己进行过滤。检查整数是否是一个整数。您可以将其他库添加到CI以实现此目的。 ACLs是非常在SaaS应用程序中很重要,因为您需要限制谁看到了什么,并且限制每个人访问他们自己站点的内容。这很容易概念化,但很难实现,应该被视为正确的1号开发任务。设计访问控制列表,测试设计,开发测试用例,如果有效,就实施它。

性能:

CI是性能没有太大的内存占用的相当不错,重量轻。您将尽可能地利用缓存 - 数据库,文件,APC,Memcache等。请记住,数据库缓存始终比文件缓存更快,但它会为数据库服务器创建更多的套接字/ tcp请求。如果数据库服务器存在瓶颈,则会影响网站性能。

当谈到性能时,我会推荐一件事,看看使用几个不同的Web服务器并在您要运行的硬件上加载测试。好的选择是Apache,Nginx & LiteSpeed。我以前使用Apache & Nginx;它们在某些情况下表现都很好,如果您适当调整它们,就可以毫不费力地处理大量的流量。请记住,Nginx配置与Apache不同,因此htaccess规则必须以Nginx格式编写并保存到站点配置中。您还将使用php-fpm而不是suexec。如果您确实使用Apache,请确保将htaccess规则保存到站点配置文件,而不是在根目录中使用.htaccess文件。原因是文件统计信息会创建I/O请求,并且很多I/O请求最终会造成瓶颈。

100%尽可能使用应用程序级缓存,只要确保提前计划关键指标,以便为每个客户端网站提取正确缓存的信息。一个好方法是对网站名称进行散列,或者甚至将URL用作关键索引的一部分(例如www_joeblogs_com_somekeyasdasd)。我知道一些CMS应用程序不这样做(Joomla),所以你会从其他网站返回数据!