PHP / MySQL安全登录&会议

时间:2010-08-20 08:56:30

标签: php mysql security passwords username

我有一个登录服务到我当前的网站,我想知道的是 - 有什么特别的方法你可以称之为MOST安全吗?

请允许我更好地解释一下我的系统:

我目前有一个带有用户表的PHP MySQL数据库。用户名和密码都存储为VARCHAR(对我所知的密码不是最好的。)

在注册表单方面,我通过仅允许a-Z 0-9条目并限制字符数来规范密码和用户名的选择。在登录表单方面,我使用mysql_real_escape_string来阻止攻击,我使用POST来代替AJAX。

我觉得我正在尽我所能阻止来自表单方面的攻击,但不是来自数据库方面。我知道你可以改变密码存储的类型,以便在进入数据库时​​加密,但我不明白的是我将如何查询这个加密的字符串。

鉴于我所描述的内容,您会在增加安全性方面提出什么建议?为什么?您选择哪种方法来防止黑客攻击和攻击?你能在我所描述的内容中看到任何明显的安全漏洞吗?也许最重要的是,我可以做些什么来纠正这些问题,因为我没有长时间参与网络开发游戏并且没有太多经验?

(请记住,我没有创建一个容纳机密或煽动性数据的系统)

4 个答案:

答案 0 :(得分:5)

首先,不要在数据库中存储纯文本密码。因此,在注册新用户时,请将其密码插入hash。 MD5最常用于此。我建议用这种盐。所以存储:

$password = md5($yoursalt . $_POST['password']);

现在,当用户想要登录时,您的帖子中又有了密码。现在创建与以前相同的哈希,并在数据库中搜索此哈希(使用其用户名)。这样您就不会存储他们的实际密码。

答案 1 :(得分:3)

将密码哈希到MD5或SHA1是Web安全的重要部分。然后匹配密码的方法是首先使用提供的用户名从数据库中检索散列密码,哈希用户提供的密码,然后匹配两个哈希值。由于MD5和SHA1是单向散列,因此意味着如果用户丢失了当前密码,则无法检索当前密码。需要重新创建新密码。您可以使用PHP的mcrypt()函数来解决这个问题。

您还应该允许密码中包含特殊字符。这只会增加蛮力攻击的复杂性。

您还可以在3次错误尝试后锁定帐户一段时间,甚至可以在10次尝试后锁定IP地址。虽然后者属于“焦油坑”类别。只是让黑客变得更加困难。

答案 2 :(得分:1)

我在生成密码时总是使用用户特定的盐,所以我的'用户'表有两个字段'encrypted_salt'和'password'

它的顶部和底部是我sha1(encrypted_salt +'password');

生成encrypted_salt时我会使用sha1(unqid(true));它产生几乎100%的独特盐,因为它使用自己的额外熵(盐)时间到毫秒。获得重复的可能性几乎为0。

所以:

$salt = sha1(unqid(true));
$password = sha1($_POST['password']);

将数据库存储为:

$pw = sha1($salt.$password); or sha1($password.$salt);

这并不重要。

SHA1的优点在于它始终会生成40个字符的字符串。你可以越多地对字符串加盐,特别是如果你可以为每个密码生成一个唯一的盐。

答案 3 :(得分:1)

就你的SQL而言,不要使用像mysql_real_escape_string这样的字符串复制函数,它仍然允许在某些情况下发生注入攻击。使用参数化查询,从而确保数据库在所有情况下将所有用户提供的字符串视为数据,而不是可能作为SQL代码片段。

PHP中的MySQLi和PDO库都支持参数化查询。