我正在创建一个 Web 应用程序,它从每个用户那里收集大量个人信息,这些信息可能会被黑客入侵。关于数据库安全,我应该注意哪些约定和做法?例如,我是否应该为应用程序的每个用户创建一个具有唯一用户名和密码的单独 MySQL 用户帐户,以防止用户能够检索其他人的信息?
2 回答
硬件级安全
确保硬件位于安全的设施中,最好是具有冗余电源、主干连接等的设施。我居住的城市有一个洞穴网络,那里有一个数据中心。该中心与城市电网有六个不同的连接,并连接到多个骨干供应商——非常酷。
应用级安全
您将希望使用参数化查询来避免 SQL 注入。如果您使用的是 PHP,我建议使用PDO。
您还需要使用“白名单” - 只允许来自预定义的有效值列表的值。例如,当允许某人输入名字时,您可能会将有效字符限制为仅为 [a-zA-Z](仅限大写和小写字母)。正则表达式在这里派上用场。
您需要设置与此类似的表来处理安全性:
actions
id unsigned int(P)
description varchar(50) // Delete users, edit account, etc.
roles
id unsigned int(P)
description varchar(50) // Billing admin, web developer, etc.
roles_actions
id unsigned int(P)
role_id unsigned int(F roles.id)
action_id unsigned int(F actions.id)
users
id unsigned int(P)
username varchar(32)
password varbinary(255)
…
users_roles
id unsigned int(P)
user_id unsigned int(F users.id)
role_id unsigned int(F roles.id)
这将允许无限数量的操作与每个角色相关联,并且允许无限数量的角色与每个用户相关联。使管理用户之间的权限变得相当容易。
如果您正在考虑存储信用卡信息,您需要先进行大量研究。围绕这一点存在一些严重的问题。
出于安全原因,您可能希望记录对页面的每次“访问”(IP 地址、用户 ID – 如果是未登录的人,则为 NULL 等)
您可能希望维护对数据库中每个表所做的每次更改的审计跟踪。触发器可以很方便。
数据库级安全
这只是我脑海中的一些事情。
让我们明确一点:应用程序访问数据库应该有一个凭证,个人应该有其他凭证。个人将只提供授权用户和建立会话的凭据。它不会用于操作数据库。这就是应用程序的工作。
这些应该是基于角色的;用户应该不同于管理员,用户应该只看到自己的信息。
在持久化之前,所有输入都应该经过验证和绑定。您不想遭受 SQL 注入的影响。
您需要对这些密码进行加密、加盐和哈希处理。
您可能还想考虑加密数据库中的 PII 数据。
这是一个很大的话题,不适合无知或胆小的人。你需要做更多的研究而不是在 SO 上提问。