Jay*_*ard 97
你应该永远不会逃避,修剪或使用任何其他清理机制,你将使用PHP进行散列password_hash(),原因有很多,其中最大的一个是因为对密码进行额外的清理需要不必要的额外代码.
您将争辩(并且您在用户数据被接受在您的系统中使用的每个帖子中都会看到它)我们应该清理所有用户输入,并且您对我们接受用户的其他所有信息都是正确的.密码不同.散列密码不能提供任何SQL注入威胁,因为字符串在存储到数据库之前会变为散列.
散列密码的行为是使密码安全存储在数据库中的行为.散列函数对任何字节都没有特殊含义,因此出于安全原因,不需要清理其输入
如果您遵循允许用户使用他们想要的密码/短语的咒语,并且您不限制密码,允许任何长度,任意数量的空格和任何特殊字符散列将使密码/密码安全无论内容中包含什么密码.截至目前最常见的哈希值(默认值),PASSWORD_BCRYPT将密码转换为60字符宽的字符串,其中包含随机盐以及散列密码信息和成本(创建哈希的算法成本):
PASSWORD_BCRYPT用于使用CRYPT_BLOWFISH算法创建新的密码哈希值.这将始终导致使用"$ 2y $"crypt格式的哈希值,该格式总是60个字符宽.
用于存储的哈希空间要求若有变更为不同的散列方法是添加到函数,所以它始终是更好地去列类型较大的存储的哈希,如VARCHAR(255)或TEXT.
您可以使用完整的SQL查询作为您的密码,它将被散列,使SQL引擎无法执行,例如,
SELECT * FROM `users`;
Run Code Online (Sandbox Code Playgroud)
可以哈希到 $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']));
Run Code Online (Sandbox Code Playgroud)
结果:
string(40) "I'm a "dessert topping" & a <floor wax>!" // spaces at the end are missing
string(65) "I'm a "dessert topping" & a <floor wax>! " // double quotes, ampersand and braces have been changed
string(65) "I'm a "dessert topping" & a <floor wax>! " // 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
Run Code Online (Sandbox Code Playgroud)
当我们发送这些内容时会发生什么password_hash()?它们都被散列,就像上面的查询一样.当您尝试验证密码时,会出现此问题.如果我们采用这些方法中的一种或多种,我们必须在比较它们之前重新使用它们password_verify().以下将失败:
password_verify($_POST['upassword'], $hashed_password); // where $hashed_password comes from a database query
Run Code Online (Sandbox Code Playgroud)
在密码验证中使用结果之前,您必须通过您选择的清理方法运行发布的密码.这是一组不必要的步骤,并且会使哈希变得更好.
使用小于5.5的PHP版本?您可以使用password_hash() 兼容包.
你真的不应该使用MD5密码哈希.
leg*_*cia 35
在对密码进行散列之前,您应该按照RFC 7613的第4节中的描述对其进行标准化.特别是:
- 附加映射规则:任何非ASCII空间的实例必须映射到ASCII空间(U + 0020); 非ASCII空间是具有Unicode常规类别"Z"的任何Unicode代码点(U + 0020除外).
和:
- 规范化规则:Unicode规范化表格C(NFC)必须应用于所有字符.
这会尝试确保如果用户键入相同的密码但使用不同的输入法,则仍应接受密码.