将从表单输入的文本插入数据库,我是否安全地进行了操作?

时间:2013-08-18 03:06:55

标签: php mysql security mysqli

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

我没有大量的安全经验,所以我想确保我做得对。

基本上,为了在代码中访问数据库,我创建了一个只具有插入数据库权限的用户。而已。我在代码中登录该用户以插入数据。

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

我正在存储用户电子邮件地址。我逃避数据以防止注入攻击,但我是否需要将其存储为像密码一样的哈希值?

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

3 个答案:

答案 0 :(得分:0)

存储电子邮件散列通常很麻烦,通常不是必需的,但这取决于您的网站/功能/服务等.IE具有特定安全级别要求的政府网站可能希望电子邮件地址加密,因为它们可能很高排名理事会官员(等)。 这确实取决于个人情况。

密码 - 永远不会以纯文本形式存储。即使您为自己的网站管理员或其他任何人做了自己的小登录,最好还是做正确的事情,这将有助于您学习并生成可在其他网站/项目上重复使用的模板代码。

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

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

由于您已经在使用MYSQLI,我建议您查看crypt blowfish,它非常直接,是一种存储和检索密码的现代安全方式。

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

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等,然后一旦您对数据有效感到高兴,就可以将其存储在数据库中。

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

答案 1 :(得分:-1)

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

答案 2 :(得分:-2)

  

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

不,你不是。

  

我创建的用户只有插入

的权限

这是一个无用的措施。

  

我用看似简单的文字登录,我确信这是一个坏主意。

不是。严格地说,你别无他法。

  

我是否需要存储电子邮件哈希,就像我会输入密码一样?

请注意,无法从哈希中收回电子邮件。如果你不需要电子邮件的目的 - 只是不要问用户。如果你需要发送电子邮件 - 除了纯文本之外别无他法。

  

我逃避数据以防止注入攻击

此。你做错了什么。

逃避不是用于防范攻击,也不应该用于此目的。

  

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

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

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