为了账号安全,请及时绑定邮箱和手机立即绑定

清理用户密码

清理用户密码

斯蒂芬大帝 2019-05-21 15:03:16
清理用户密码在散列它们并将它们存储在我的数据库中之前,我应该如何逃避或清除用户提供的密码?当PHP开发人员考虑出于安全目的而考虑哈希用户的密码时,他们往往会像使用任何其他用户提供的数据一样考虑这些密码。这个主题经常出现在与密码存储相关的PHP问题中; 开发人员经常希望使用诸如escape_string()(在各种迭代中)等功能清理密码htmlspecialchars(),addslashes()然后再对其进行散列并将其存储在数据库中。
查看完整描述

2 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

你应该永远不会逃避,修剪或使用任何其他清理机制,你将使用PHP进行散列password_hash(),原因有很多,其中最大的一个是因为对密码进行额外的清理需要不必要的额外代码。

您将争辩(并且您在用户系统中接受用户数据的每个帖子中都会看到它)我们应该清理所有用户输入,并且您对我们接受用户的其他所有信息都是正确的。密码不同。散列密码不能提供任何SQL注入威胁,因为字符串在存储到数据库之前会变为散列。

散列密码的行为是使密码安全存储在数据库中的行为。散列函数对任何字节都没有特殊含义,因此出于安全原因,不需要清理其输入

如果您遵循允许用户使用他们想要的密码/短语的咒语,并且您不限制密码,允许任何长度,任意数量的空格和任何特殊字符散列将使密码/密码安全无论内容中包含什么密码。截至目前最常见的哈希值(默认值),PASSWORD_BCRYPT将密码转换为60字符宽的字符串,其中包含随机盐以及散列密码信息和成本(创建哈希的算法成本):

PASSWORD_BCRYPT用于使用CRYPT_BLOWFISH算法创建新的密码哈希值。这将始终导致使用“$ 2y $”crypt格式的哈希值,该格式总是60个字符宽。

存储哈希的空间要求会随着不同的哈希方法添加到函数中而发生变化,因此最好在列类型上更大的存储哈希值,例如VARCHAR(255)TEXT

您可以使用完整的SQL查询作为您的密码,它将被散列,使SQL引擎无法执行,例如,

SELECT * FROM `users`;

可以哈希到 $2y$10$1tOKcWUWBW5gBka04tGMO.BH7gs/qjAHZsC5wyG0zmI2C.KgaqU5G

让我们看看不同的消毒方法如何影响密码 -

密码是I'm a "dessert topping" & a <floor wax>!(密码末尾有5个空格,这里没有显示。)

当我们应用以下修剪方法时,我们会得到一些不同的结果:

var_dump(trim($_POST['upassword']));var_dump(htmlentities($_POST['upassword']));var_dump(htmlspecialchars($_POST['upassword']));
var_dump(addslashes($_POST['upassword']));var_dump(strip_tags($_POST['upassword']));

结果:

string(40) "I'm a "dessert topping" & a <floor wax>!" // spaces at the end are missing

string(65) "I'm a &quot;dessert topping&quot; &amp; a &lt;floor wax&gt;!     " // double quotes, ampersand and braces have been changed

string(65) "I'm a &quot;dessert topping&quot; &amp; a &lt;floor wax&gt;!     " // same here

string(48) "I\'m a \"dessert topping\" & a <floor wax>!     " // escape characters have been added

string(34) "I'm a "dessert topping" & a !     " // looks like we have something missing

当我们发送这些内容时会发生什么password_hash()?它们都被散列,就像上面的查询一样。当您尝试验证密码时,会出现此问题。如果我们采用这些方法中的一种或多种,我们必须在比较它们之前重新使用它们password_verify()。以下将失败:


password_verify($_POST['upassword'], $hashed_password); // where $hashed_password comes from a database query

在密码验证中使用结果之前,您必须通过您选择的清理方法运行发布的密码。这是一组不必要的步骤,并且会使哈希变得更好。


查看完整回答
反对 回复 2019-05-21
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

在对密码进行散列之前,您应该按照RFC 7613第4节中的说明对其进行规范化。特别是:

  1. 附加映射规则:任何非ASCII空间的实例必须映射到ASCII空间(U + 0020); 非ASCII空间是具有Unicode常规类别“Z”的任何Unicode代码点(U + 0020除外)。

和:

  1. 规范化规则:Unicode规范化表格C(NFC)必须应用于所有字符。

这会尝试确保如果用户键入相同的密码但使用不同的输入法,则仍应接受密码。


查看完整回答
反对 回复 2019-05-21
  • 2 回答
  • 0 关注
  • 570 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信