【问题标题】:Hide passwords in string隐藏字符串中的密码
【发布时间】:2016-12-07 04:53:13
【问题描述】:

tl;博士 在这些情况下,如何使用正则表达式将单词 secret 替换为 ********:

Password="secret"
PWD="secret"
-P secret -i args

我正在尝试制作一个正则表达式,它将检测字符串中的密码并将其替换为 *(在日志记录函数中)。

我目前有这个 Powershell 功能:

function ScrubPasswords {
param(
    [string]$DirtyText
)
    # match any case of password="" (or PWD="") (or -P .*)
    $PwdArgRegex=[regex]'(([Pp][Aa][Ss][Ss][Ww][Oo][Rr][Dd]|PWD)=)("[^"]+")'
    $PwdArgRegex.replace($DirtyText,'$1********')
}

效果很好,它将引号之间的密码替换为 8 个 *。

但我发现另一个标识密码的字符串即将到来。对于 sqlcmd.exe,参数列表是 -U 用户名 -P 密码,我想从那里清除密码。

我尝试将 |(-P\s([^\s]+)\s) 添加到正则表达式,但它用 * 替换了整个匹配字符串(-P thispassword -i otherargs 变为 ***** ***-i otherargs;不必要地去掉 -P\s 和尾随 \s)。

我正在https://regex101.com/ 进行正则表达式设计/测试,然后当我有看起来不错的东西时,我通过 Powershell_ISE 运行它。

我认为我遇到的问题是我在第二个 OR“|”的两侧有不同数量的组。我将继续摆弄括号,看看我是否可以让匹配组在两边都匹配。

我需要一些帮助来解决这个问题,或者也许有更好的方法来实现我的目标。

这是我迄今为止的最大努力:

((([Pp][Aa][Ss][Ss][Ww][Oo][Rr][Dd]|PWD)=)("[^"]+")|(-P\s([^\s]+)\s))

有了这些结果:

Match 1
Full match  23-38   `-P @@@sapwd@@@ `
Group 1.    23-38   `-P @@@sapwd@@@ `
Group 2.    787-787 ``
Group 3.    787-787 ``
Group 4.    787-787 ``
Group 5.    23-38   `-P @@@sapwd@@@ `
Group 6.    26-37   `@@@sapwd@@@`
Match 2
Full match  235-250 `-P @@@sapwd@@@ `
Group 1.    235-250 `-P @@@sapwd@@@ `
Group 2.    787-787 ``
Group 3.    787-787 ``
Group 4.    787-787 ``
Group 5.    235-250 `-P @@@sapwd@@@ `
Group 6.    238-249 `@@@sapwd@@@`
Match 3
Full match  459-487 `Password="@@@NMApassword@@@"`
Group 1.    459-487 `Password="@@@NMApassword@@@"`
Group 2.    459-468 `Password=`
Group 3.    459-467 `Password`
Group 4.    468-487 `"@@@NMApassword@@@"`
Group 5.    787-787 ``
Group 6.    787-787 ``
Match 4
Full match  652-669 `PWD="@@@SAPWD@@@"`
Group 1.    652-669 `PWD="@@@SAPWD@@@"`
Group 2.    652-656 `PWD=`
Group 3.    652-655 `PWD`
Group 4.    656-669 `"@@@SAPWD@@@"`
Group 5.    787-787 ``
Group 6.    787-787 ``

使用此测试数据

=begin data=

Result of sqlcmd -U sa -P @@@sapwd@@@ -i  C:\scripts\BridgepointScriptingLibrary\tmp\StandupScripts\common\000_SQLServer_Post_Install_Script.sql = Changed database context to 'master'.  (5 rows affected)

Preparing to run sqlcmd -U sa -P @@@sapwd@@@ -i 000_SQLServer_Post_Install_Script.sql.

Auth User="@@@NMAusername@@@" Password="@@@NMApassword@@@"
PathFromBinRoot="SQL Server 2008 R2 SP1 (x64bit).exe" PWD="@@@SAPWD@@@"

=end data=

【问题讨论】:

  • 看起来您的正则表达式匹配。也许替换应该是:$DirtyText.replace($1,'*********'); 但我真的不知道 Powershell。

标签: regex powershell


【解决方案1】:

这个正则表达式应该这样做(regex101):

(?:(?<=Password=")\S+(?="))|(?:(?<=-P\s)\S+)|(?:(?<=PWD=")\S+(?="))

代码:

function ScrubPasswords {
param(
    [string]$DirtyText
)
    # match any case of password="" (or PWD="") (or -P .*)
    $DirtyText -replace '(?:(?<=Password=")\S+(?="))|(?:(?<=-P\s)\S+)|(?:(?<=PWD=")\S+(?="))', '********'
}


$testData = 
@'
=begin data=

Result of sqlcmd -U sa -P @@@sapwd@@@ -i C:\scripts\BridgepointScriptingLibrary\tmp\StandupScripts\common\000_SQLServer_Post_Install_Script.sql = Changed database context to 'master'. (5 rows affected)

Preparing to run sqlcmd -U sa -P @@@sapwd@@@ -i 000_SQLServer_Post_Install_Script.sql.

Auth User="@@@NMAusername@@@" Password="@@@NMApassword@@@" PathFromBinRoot="SQL Server 2008 R2 SP1 (x64bit).exe" PWD="@@@SAPWD@@@"

=end data=
'@

ScrubPasswords $testData

输出:

=begin data=

Result of sqlcmd -U sa -P ******** -i C:\scripts\BridgepointScriptingLibrary\tmp\StandupScripts\common\000_SQLServer_Post_Install_Script.sql = Changed database context to 'master'. (5 rows affected
)

Preparing to run sqlcmd -U sa -P ******** -i 000_SQLServer_Post_Install_Script.sql.

Auth User="@@@NMAusername@@@" Password="********" PathFromBinRoot="SQL Server 2008 R2 SP1 (x64bit).exe" PWD="********"

=end data=

【讨论】:

  • 我不是正则表达式专家 - 可能有更好的解决方案。但是,当使用密码或密码时,我使用三个非捕获组与 OR 一起使用一些正向后视来获得正确的位置,并使用正向前瞻来留下报价。只需像第一个一样查看每个单独的组。 (?:(?&lt;=Password=")\S+(?="))。也许@Wiktor Stribiżew 可以进一步改善这一点:-)
猜你喜欢
  • 2018-01-23
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2011-11-26
  • 2016-06-05
相关资源
最近更新 更多