1

我在 bcrypting 后存储密码,但用户电子邮件 ID 为纯文本(不加密),因为我想定期向该电子邮件 ID 发送时事通讯。我有两个问题?

  1. 如何保护数据库,以便可以保护数据库中纯文本的电子邮件 ID 免受黑客攻击?

  2. 有什么方法可以检查特定的数据库表是否只能由我的 Web 表单访问,而不是来自外部?

注意:我是数据库新手。

4

2 回答 2

1

1-如果您真的想对电子邮件进行编码,并且将来需要对其进行解码,最好的办法是查看 MySQL 加密函数,如ENCODE()DECODE()。首先你需要设置一个“盐”。这就像一个密码。每条记录都可以是相同的,如下所示:

SELECT DECODE(email, 'mysecretsalt') FROM Table WHERE id=1

或者,您可以从代码和表中的另一个字段中制作盐部分,如下所示:

SELECT DECODE(email, CONCAT('mysecretsalt', id)) FROM Table WHERE id=1

2-在您的数据库中设置一个特定用户,该用户仅有权访问该特定表,并且在您添加记录时仅具有 INSERT 权限,然后在您检索记录时设置另一个仅具有 SELECT 权限的用户。此外,将这些用户锁定到“本地主机”。如果黑客得到其中之一,他们将无能为力。

此外,当您以请求变量(GET 或 POST)的形式收到来自客户的电子邮件时,为了防止 SQL 注入攻击,请转义字符(在 PHP 中,您可以使用mysqli_real_escape_string())或简单地删除所有不支持的字符不属于。在 PHP 中,它看起来像这样:

$email = preg_replace('/[^A-Za-z0-9\\.@-_]/', '', $email);

这就是我喜欢做的方式。

于 2013-05-16T17:27:55.577 回答
0

以明文形式存储电子邮件没有任何问题。即使被访问,它们也不允许攻击者访问帐户(只要身份验证正常工作)。除非您有一些我们不知道的非常具体的要求,否则没有理由对它们进行加密。

如果您想总体上保护您的数据库:

  • 阅读数据库文档
  • 如果您有多个服务/脚本访问数据,请确保他们有单独的帐户并且只能访问他们需要访问的数据
  • 确保您的数据库备份至少与数据库本身一样安全
  • 将帐户的源主机(可能在设置用户时)限制为仅允许来自您的 Web 前端的连接,或者如果您在同一主机上运行,​​您可以禁用除环回之外的所有内容(将数据库绑定到 127.0.0.1)
  • ...许多其他事情是可能的,但从基础开始...您会在文档中找到更多想法,我敢肯定
于 2013-05-16T17:07:04.820 回答