我正在创建一个Web应用程序,它收集每个用户的大量个人信息,这些信息可能被黑客入侵。关于数据库安全,我应该了解哪些约定和做法?例如,我应该为应用程序的每个用户创建一个具有唯一用户名和密码的单独MySQL用户帐户,以防止用户能够检索其他用户的信息吗?
答案 0 :(得分:3)
硬件级安全性
确保硬件位于安全设施中,最好是具有冗余电源,骨干网连接等的设施。我住的城市有一个洞穴网络,那里有一个数据中心。该中心与城市电网有六个不同的连接,并与多个骨干网供应商相连 - 非常酷。
应用程序级安全性
您希望使用parameterized queries来避免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)等。
您可能希望维护对数据库中每个表所做的每个更改的审计跟踪。触发器可以很方便。
数据库级安全性
您需要关注Principle of Least Privilege。您还需要查看Stored Procedures。
这只是我头脑中的一些事情。
答案 1 :(得分:1)
让我们明确一点:应用程序应该有一个凭据来访问数据库,其他凭证应该是个人的。个人仅提供授权用户的凭证并设置会话。它不会用于操纵数据库。那是应用程序的工作。
那些应该是基于角色的;用户应该与管理员不同,用户应该只看到自己的信息。
所有输入都应在持久化之前进行验证和绑定。你不想遭受SQL注入。
您希望加密,加密和散列这些密码。
您可能还想考虑加密数据库中的PII数据。
这是一个很大的话题,不是因为无知或胆小的人。你需要做更多的研究,而不是在SO上提问。