2017-10-27 27 views
0

私は自分のWebサイト(ColdFusion)に電子メールでパスワードリマインダーを送信する機能を持っています。私は最初と最後を除くパスワード文字列のすべての文字を置き換えたいと思うので、リマインダ電子メールにはパスワード全体が含まれていません...ColdFusion文字列内の文字を置換する

したがって、 'Password123'を含むメールの代わりに 'P * ... * 3 '

私は開発者ではありません。電子メールテンプレートには<cfoutput>#password#</cfoutput>があります。上記に使用できる文字列処理関数はありますか?

元の文字の正確な数を置き換える必要はありません。それは最初と最後であり、他はすべて '...'に置き換えられます。

+2

これは、あなたの質問を解決していませんが、それはあなたが平文でパスワードを保存している質問から明らかです。これは常に悪い考えです。パスワードは、データベースを参照している誰もあなたのすべてのパスワードのリストを取得できないように、塩漬けされたハッシュとして保存する必要があります。それについてもっと読む:http://www.learncfinaweek.com/week1/Secure_Password_Storage/ – beloitdavisja

+1

優秀なポイント@beloitdavisja。実際には、ユーザーに何らかのパスワードを送り返すべきではありません。また、パスワードをハッシュとして保存することができなくなります。代わりに、パスワードをリセットするか、初回のログイン時にリセットする必要がある一時パスワードを送信する権限を与えます。 –

+0

私はこれを十分に言及することはできないと考えているので、パスワードを復旧することはできません。パスワードを忘れた場合は、パスワードをリセットする必要があります。 – Shawn

答えて

1

これを行う方法が1つあります。最初の文字を取得するには関数left()を使用し、最後の文字を取得するには関数right()を使用してください。他の文字をすべて.などに置き換えることはお勧めしません。あなたはパスワードの実際の文字数を開示します。代わりに、私はちょうど最初と最後の文字の間に3つの.または*を入れるでしょう。

これはあなたのために行うコードです。その間に他の文字を置き換える方法の例も含めましたが、それを行うことはお勧めしません。

<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

+0

Regexを使うか、ソリューションを使う方が良いでしょうか? – RRK

+0

このような単純なことは、RegExが必要ないと思います。しかし、それは間違いなく機能します。あなたが望むならば、例を使って答えを投稿しても構いません。これを達成する方法は数多くあります。 –

0

正直、私はここで解決策をお勧めしません。役に立たないことではなく、その疑問の前提が強く避けられるべきであるからです。 Miguel-Fの答えは尋ねられた元の要求を行いますが、パスワードのプレーンテキストストレージである実際の問題はここでは解決しません。

あなたはパスワードでできることが限られているかもしれませんが、電子メール通知の内容を隠すのではなく、パスワードを使って作業する方法を真剣に考えていきます。それは今より大きな頭痛になるでしょうが、それは違反の頭痛のトンを保存します。パスワードは決して回復可能ではありません。

チェックアウトhttps://www.owasp.org/index.php/Password_Storage_Cheat_Sheet

注:文字列の最初と最後の文字以外の文字をすべて置き換えるには、CFのJava実装にドロップして、Java Regex(CFよりも少し良い)を使用します。 I これは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

+0

注2:このように置換えを行うと、パスワードのエントロピーが大幅に減少し、悪用されやすくなります。これにより、最初と最後の文字とパスワードの長さが与えられます。 – Shawn

関連する問題