在PHP / MySQL应用程序中保护敏感数据的实用方法?

时间:2015-04-23 13:43:20

标签: php mysql security

我的网站上有一个表单,用于收集一些相当敏感的数据(个人识别数据)。我一直在这里阅读如何最好的保障,并有点不知所措的意见。首先,让我解释一下到目前为止我所做的事情:

  • 我的网站是一个joomla 3.x网站,并且为了检索任何表单数据,它使用内置类完成一些输入验证(即我不只是采用原始GET或POST数据)。
  • 我的网站没有用户注册。只有一个超级用户帐户,我是唯一的管理员。
  • 我有一个共享的网络主机,无法真正说出他们的内部措施。
  • 我设置了表单,以便通过https。
  • 完成
  • 在PHP配置中,我确保启用了魔术引号。
  • 在进行数据库查询时,Joomla使用了一个转义字符串的内置类(所以我认为该网站至少在一定程度上抵制了SQL注入)。
  • 对于所有表单字段,我将varchar长度限制为合理的值。

到目前为止,数据作为纯文本存储在数据库中,这就是我想要更改的内容。我读到了MySQL内置的AES函数和BLOB,但我在这里读到很多人都反对它(尽管其他人认为它很好......)。我知道最终的方法可能是使用外部存储在别处的密钥,但我也尽量保持简单,同时保证足够安全。如果我采取其他措施来保护(如上所述)MySQL功能是否会给我一定程度的安全性?

此外,当用户提交表单时,他们会收到包含其数据的电子邮件。我确认电子邮件似乎有点安全,因为标题显示

Received: from myhost (myhost. [IP])
    by mx.google.com with ESMTPS id
    br2si8908071ojb.205.2015.04.22.08.36.02
    for <someemail>
    (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);

无论如何,在我开始在数据库中实现某种安全存储之前,我很好奇你们所推荐的一种很好的实用方法。

2 个答案:

答案 0 :(得分:1)

我认为很大程度上取决于您的用例。以后您需要对这些数据做什么?我肯定会在将数据插入数据库之前对其进行加密和加密,我会尽量确保您的应用程序的任何其他部分都不会被SQL注入轻易入侵(查找Joomla hacks,是否可能?)等等,我将审查管理员登录的方式,以确保它不能成为攻击的载体。

我看到一个更大的问题是发送这个&#34;敏感&#34;通过未加密的电子邮件发送数据可能只是为了消除所有其他保护它的尝试。我认为您显示的标题仅与您与SMTP服务器的连接有关,但此内容将永久留在Google的服务器上,它将被发送到可能不太安全的目标服务器,它可能会使用未加密的连接检索。

答案 1 :(得分:1)

有几件事。

首先,不要使用魔法引号;特别是如果您已经使用内置类转义值。这将导致潜在的双重转义输入,这很糟糕。此外,魔术引号通常不被认为是安全的(因为它们是魔术)。资料来源:http://php.net/manual/en/security.magicquotes.php。从手册:

"Warning This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0."

其次,您希望再次获得想要查看的数据。例如,名称,日期,信用卡号码。

你不想再看到什么,哈希。我的意思是,如果您只需要比较数据而不是像密码那样读取数据,请使用SHA256(或更好)来无条件地消除数据被反转的可能性。

关于salting(另一个答案提到),这指的是在加密或散列中添加随机字符串以避免称为彩虹表的攻击的做法。这个过程看起来像这样(伪代码)

var salt = "9285gh8927thg0nfc30897gnvh2087vgh 8g7v2n";
var data = "sensitive data";

var encrypted_data = encrypt(data + salt);

对于数据过滤,您不仅要处理SQL注入(尽管这是一个好的开始)。您还想看看XSS(OWASP:https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29

另外,作为旁白;您应该拥有只有权执行某种操作的数据库用户(即:用户写入数据库,用户从数据库中读取)。

希望这有帮助!