用星号替换PHP中的所有字符

15

假设我有一个字符串密码:

$password = "thisisaplaintextpassword"

我该如何将它转换为以下内容?

$password = "************************"

我希望能够通过电子邮件向用户发送他们的账户详情,但不想发送全部内容。


那么为什么你要发送密码,如果它不是必需的,并且不想发送整个东西呢? - Jenz
4
如果没有人能看到它-1.为什么要发送它?2.长度有多长谁在意? - u_mulder
1
@Jenz 这样他们就可以看到密码的长度。 - ThatGuy343
2
为什么这很重要?如果你不知道如何做,请不要回答,去打扰其他提问者。 - ThatGuy343
@ThatGuy343,如果你将其存储到Web根目录或者你的服务器软件存在漏洞,或者PHP程序允许路径遍历等等,都有可能导致问题。有太多的可能性 - 最好不要这样做。顺便说一句,你知道他们的密码并不好。大多数人很懒,会为所有东西使用相同的密码。 - coding Bott
显示剩余5条评论
4个回答

37

使用str_repeat

$password = str_repeat("*", strlen($password)); 

10

您不应该向用户展示密码长度,因为这会泄露应该是安全的信息。

在下面的评论中,使用的是“苏格拉底方法”,通过问“你为什么想这样做?”来给出建议“不要这样做”,但是苏格拉底方法旨在鼓励您思考问题被提出的原因。您应该得出的结论是“您不应该问那个具体的问题,因为提出该问题的基础是有缺陷的”。只需使用静态字符串即可。这比实际告诉您如何在特定情况下执行错误操作更好。

其次,向用户显示反映其密码长度的星号序列,有点暗示您要么以明文形式存储其密码,要么只加密了它,以便您可以将其还原为原始格式以确定其长度。这表明您进一步缺乏安全性。除非有非常好的理由,否则只应存储密码的哈希值。哈希值具有统一的长度,因此您的问题就变得多余了。

所以,简单地说,您不应该这样做。那就是您正在提出的问题的答案。

但是,为了完整起见,我将重复您已经在其他回答中得到的答案:

function stringToAsterisks($string){
    return str_repeat("*", strlen($string)); 
}

http://php.net/manual/zh/function.str-repeat.php


我明白了,谢谢你的见解。这是我第一次设置账户系统。 - ThatGuy343
1
没问题:我们都是从某个地方开始的,有些东西第一次可能不太容易理解。我可以建议你不要自己发明整个东西,而是阅读关于如何最好地处理这种事情的方法,特别是涉及到保护人们数据的时候。 - Adam Cameron
调试过程中,了解密码的长度非常有用,毕竟这可以判断是否缺失或者长度太短。另一方面,无论穷举攻击需要几千年还是几百万年,这都是不相关的。 - Roland Seuhs

2
function hidePassword($p) {
    $fit = strlen($p);
    return sprintf("%'*-${fit}s",false);
}

echo hidePassword($p);

1
$password = "thisisaplaintextpassword"
echo str_repeat("*",strlen($password));

样例输入

testingpass

样例输出

***********

示例输入

hello

样本输出
*****

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接