0

使用 phpMyAdmin,我创建了一个 MySQL 数据库以供用户输入文本的简单表单使用,然后我将其保存到表中。

我在安全方面没有丰富的经验,所以我想确保我做的事情是正确的。

基本上,为了在代码中访问数据库,我创建了一个只有权限才能插入数据库的用户。就是这样。我在代码中使用该用户登录以插入数据。

但是,在代码中,我使用看似纯文本的方式登录,我很确定这是一个坏主意。我new mysqli(...)用来登录,我只是将用户名和密码作为字符串提供。这是纯文本和安全问题吗?如果是这样,我应该怎么做?

我正在存储用户电子邮件地址。我转义数据以防止注入攻击,但我是否需要像密码一样将其存储为散列?

谢谢,我只是想确保我正在适当地处理这方面的安全问题。还有什么我应该记住的吗?

4

3 回答 3

0

存储散列的电子邮件通常会很痛苦,而且通常不是必需的,尽管它取决于您的站点/功能/服务等。即具有一定安全级别要求的政府站点可能希望对电子邮件地址进行加密,因为它们可能是高级理事会官员(ETC)。这确实取决于个人情况。

密码 - 永远不要以纯文本形式存储。即使为您自己的站点管理员或其他任何东西进行自己的小登录,做正确的事情也是一个好习惯,另外这将帮助您学习并生成可以在其他站点/项目上重复使用的模板代码。

如果您显示您的登录代码,我们可以看看。

在任何用户输入代码上,您都应该验证数据是可接受的以及您所期望的。即使是您自己的登录区域,虽然您显然不会入侵自己,但正确地做事并再次为您提供公共区域的模板代码(而且您永远不知道谁可以访问您的登录区域)仍然是一种很好的做法。使用 PHP 函数如 strlen()、is_numeric() 和一些正则表达式来检查输入数据是否正常(即最大或最小字符长度,只能输入数字或字母数字等)。这也用于维护数据库,就像您有一个 varchar(20) 列一样,使用 strlen 检查用户输入是否为 20 也可以避免任何数据库问题。

由于您已经在使用 MYSQLI,我建议您研究一下 crypt blowfish,它非常简单,是一种现代的安全方式来存储和检索密码。

一个非常基本的使用地穴和河豚的介绍:

require('PasswordHash.php');//you download this file, and just include it
//it contains all the hashing engine etc

// $PostPassword is the one they entered in a form (etc)
$CreateHash = new PasswordHash(8, FALSE);
$HashPassword = $CreateHash->HashPassword($PostPassword);

// $HashPassword is the hashed and salted password you store in the db
// (should always be 60 chars, check with strlen)
// Don't use your own salt, it's not worth it 
// and you end up having to use it/store it/remember it
// when checking their password for login etc.
// just use the built in blowfish random salting algos


// Then to check their pass (ie login)
// Query and select their password from DB ($DbPass)
// with their username entered in the login form
// Check it against the password they entered in form
// (CheckPassword salts/hashes automatically to match the DB one)

$CreateHash = new PasswordHash(8, FALSE);

$CheckPass = $CreateHash->CheckPassword($PostPassword, $DbPass);
if ($CheckPass)
  {
    // password matches
  }
else
  {
    //not match, tell them to try again etc
  }

// you can use various checks on this, mainly check if the 
// library exists (to avoid php errors etc)
if(defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) 
  {
    // do all your password stuff
  }

在执行上述操作之前,您需要进行其他检查,例如 strlen 等,然后一旦您对数据有效,您就可以将其存储在数据库中。

您还应该在数据库查询中使用准备好的语句,因为这是一种非常安全的方法。

于 2013-08-18T03:26:49.037 回答
-1

以明文形式存储个人身份信息绝不是一个好主意。除非它是双向哈希,否则您不能使用哈希。它不一定需要加密,但至少应该被隐藏。

于 2013-08-18T03:15:58.647 回答
-2

我只是想确保我正在适当地处理这方面的安全问题。

不,你不是。

我创建了一个只有插入权限的用户

这是一个相当无用的措施。

我用看似纯文本的方式登录,我很确定这是一个坏主意。

它不是。严格来说,你没有别的办法。

我需要像存储密码一样存储散列的电子邮件吗?

请注意,没有办法从哈希中取回电子邮件。如果您不需要电子邮件来实现它的目的 - 只是不要向用户询问它。如果您需要发送电子邮件 - 除了纯文本之外别无他法。

我转义数据以防止注入攻击

这。是你做错了什么。

转义不是为了防止攻击而设计的,也不应该用于此目的。

还有什么我应该记住的吗?

很多。
但是关于 SQL 安全性,应该有一个严格的规则:

每个变量都应该只通过准备好的语句进入查询。

于 2013-08-18T07:15:21.470 回答