【问题标题】:Replace characters in ColdFusion string替换 ColdFusion 字符串中的字符
【发布时间】:2018-04-08 21:24:08
【问题描述】:

我的网站 (ColdFusion) 上有一个功能,可以通过电子邮件发送密码提醒。我想替换密码字符串中除第一个和最后一个之外的所有字符 - 所以提醒电子邮件不包含整个密码...

因此,不是包含“Password123”的电子邮件,而是包含“P*...*3”

正如您所猜测的那样,我不是开发人员。我可以在电子邮件模板中找到<cfoutput>#password#</cfoutput>。有没有可以用于上述的字符串处理函数?

函数不要求替换原始字符的确切数量。它可以是第一个和最后一个,其他所有内容都替换为 '...'。

【问题讨论】:

  • 这并不能解决您的问题,但是从问题中可以明显看出您是以纯文本形式存储密码。这总是一个坏主意。密码应存储为加盐散列,以便查看数据库的任何人都无法获得所有用户密码的列表。在此处阅读更多信息:learncfinaweek.com/week1/Secure_Password_Storage
  • 优秀点@beloitdavisja。实际上,您甚至不应该将任何类型的密码发送回用户。当您开始将密码存储为哈希时,您将无法做到这一点。相反,您让他们能够重置密码或向他们发送必须在初始登录时重置的临时密码。
  • 我会重申,因为我认为这不能被提及,密码应该永远无法恢复。如果有人忘记了密码,应该重置。

标签: coldfusion passwords coldfusion-9


【解决方案1】:

老实说,我什至不会在这里推荐解决方案。不是没有帮助,而是因为应该强烈反对这个问题的前提。 Miguel-F 的回答将按照要求执行原始请求,但它并没有解决这里的真正问题,即密码的纯文本存储。

您现在可以使用密码执行的操作可能受到限制,但我会认真考虑返回并修复您使用密码的方式,而不是试图掩盖您在电子邮件通知中的内容。现在这将是一个更大的头痛,但它会在违规时为您节省大量头痛。密码永远不可恢复。

查看https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet

注意:要替换字符串中除第一个和最后一个字符之外的所有字符,您可以下拉到 CF 的 Java 实现中并使用 Java Regex(这比 CF 的要好一点)。我认为这在 CF9 中有效,replaceAll() 应该在 CF9 JDK 中。你必须尝试一下。

<cfset mystring = "Password1234" >
<cfset masked = mystring.replaceAll("(?<=.).(?!$)", "*")>
<cfoutput>#masked#</cfoutput> 

https://trycf.com/gist/c33d8a9b8e7edfedb935fc7ce6654cd7/acf?theme=monokai https://www.regular-expressions.info/lookaround.html

【讨论】:

  • 注 2:像这样进行替换会显着降低密码的熵,并使其更容易被滥用。这将给出第一个和最后一个字符以及密码的长度。
【解决方案2】:

这是一种方法。只需使用函数left() 获取第一个字符,使用函数right() 获取最后一个字符。我不建议用. 或其他任何字符替换所有其他字符。您将披露密码中的实际字符数。相反,我总是在第一个字符和最后一个字符之间放置三个 .*

这里有一些代码可以为您做到这一点。请注意,我还提供了一个示例,说明如何替换中间的每个其他字符,但我不建议这样做。

<cfscript>
password = 'Password123';
password_firstchar = left(password,1);
password_lastchar = right(password,1);

writeOutput(password_firstchar & '***' & password_lastchar);

writeOutput('<p>&nbsp;</p>');

writeOutput(password_firstchar);
writeOutput(repeatString('.',len(password)-2));
writeOutput(password_lastchar);
</cfscript>

运行该代码的输出是:

P***3

P.........3

这里是该代码的要点,因此您可以运行它并使用它 - TryCF gist example

注意:您将 ColdFusion 9 指定为您的平台。该版本对cfscript 语法支持有限。我认为我给您的内容仍然适用于该版本,但如果不告诉我。您可以改用标签语法。

Here is an example that includes the tag syntax as well.

【讨论】:

  • 哪个更好,使用正则表达式还是使用您的解决方案?
  • 我认为对于像这个 RegEx 这样简单的事情是不需要的。但它肯定会奏效。如果您愿意,请随时发布带有示例的答案。有很多方法可以做到这一点。
猜你喜欢
  • 2013-11-21
  • 1970-01-01
  • 2011-12-17
  • 2020-03-08
  • 2011-07-02
相关资源
最近更新 更多