当 PHP 开发出于安全目的对用户密码进行哈希hashing 处理时,他们往往会像考虑其他用户提供的数据一样考虑这些密码。 这个主题经常出现在与密码存储有关的 PHP 问题中; 开发人员经常希望在散列密码并将其存储到数据库之前,使用 escape string ()(在各种迭代中)、 htmlspecialchars ()、 addslashes ()等函数来清理密码。
2条回答 默认 最新
- weixin_38166411 2019-07-25 10:14关注
对于使用 PHP 密码散列()进行散列的密码,您绝不应该逃避、修改或使用任何其他清理机制,原因有很多,其中最大的一个原因是,对密码进行额外清理需要不必要的额外代码。
你会争辩(你会在每篇文章中看到用户数据被接受系统中使用) ,应该清理所有用户输入的信息,这样从用户那里接受的每一条信息都是正确的。 密码是不同的,散列密码不能提供任何 SQL ,因为字符串在存储到数据库之前被转换为散列。
散列密码就是使密码可以安全地存储在数据库中。散列函数没有赋予任何字节特殊的含义,因此出于安全原因,不需要清理
如果你遵循允许用户使用他们想要的密码,并且不限制密码的长度、空格和任何特殊字符,那么无论密码中包含什么,密码都是安全的。 到目前为止,最常见的散列(默认值) PASSWORD bcrypt 将密码转换成一个60个字符宽的字符串,其中包含一个随机 salt,以及散列密码信息和一个成本(创建散列的算法成本) :
Password bcrypt 用于使用 CRYPT blowfish 算法创建新的密码散列。 这总是会导致使用“ $2y $” crypt 格式的散列,该格式总是60个字符宽。
随着不同的散列方法被添加到函数中,存储散列的空间需求可能会发生变化,所以对于存储的散列,比如 VARCHAR (255)或 TEXT,最好使用更大的列类型。
You could use a complete SQL query as your password and it would be hashed, making it unexecutable by the SQL engine e.g.,
你可以使用一个完整的 SQL query 作为你的密码散列,例如,
SELECT * FROMusers
;
可以散列为 $2y$10$1tOKcWUWBW5gBka04tGMO.BH7gs/qjAHZsC5wyG0zmI2C.KgaqU5G
看看不同的清理方法如何影响 password
密码是 I'm a "dessert topping" & a ! (密码末尾有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
在使用密码验证的结果之前,必须通过选择的清理方法运行提交的密码。这不必要也不会优化散列。
使用5.5以下的 PHP 版本? 可以使用密码散列兼容包。解决 无用评论 打赏 举报
悬赏问题
- ¥35 平滑拟合曲线该如何生成
- ¥100 c语言,请帮蒟蒻写一个题的范例作参考
- ¥15 名为“Product”的列已属于此 DataTable
- ¥15 安卓adb backup备份应用数据失败
- ¥15 eclipse运行项目时遇到的问题
- ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
- ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
- ¥15 自己瞎改改,结果现在又运行不了了
- ¥15 链式存储应该如何解决
- ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站