你应该永远不会逃避,修剪或使用任何其他清理机制,你将使用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 missingstring(65) "I'm a "dessert topping" & a <floor wax>! " // double quotes, ampersand and braces have been changedstring(65) "I'm a "dessert topping" & a <floor wax>! " // same herestring(48) "I\'m a \"dessert topping\" & a <floor wax>! " // escape characters have been addedstring(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在密码验证中使用结果之前,您必须通过您选择的清理方法运行发布的密码。这是一组不必要的步骤,并且会使哈希变得更好。