tl;dr - 要停止掩码,您需要停止引用与值{
和}
相等的任何Actions Secrets。
长篇版本
如果您首先创建了两个Actions Secrets并将其纳入工作流程范围(即在存储库或组织级别),则可以使用此GitHub Actions工作流程文件重现行为:
Actions Secrets
秘密名称 |
价值 |
LEFT_CURLY |
{ |
RIGHT_CURLY |
} |
myWorkflow.yaml
有趣的部分是 activate-masking
步骤...
name: myWorkflow
on:
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- id: define-output
name: define output
shell: pwsh
run: |
$array1 = @(
[pscustomobject] @{
"variable1" = "hello1"
},
[pscustomobject] @{
"variable1" = "hello2"
}
);
write-host "::set-output name=myjson::$( $array1 | ConvertTo-JSON -Compress)"
- id: activate-masking
name: activate masking
shell: pwsh
run: |
# referencing a secret anywhere in a step activates
# log masking for its value in the *entire* workflow
write-host "left = '${{ secrets.LEFT_CURLY}}'"
write-host "right = '${{ secrets.RIGHT_CURLY }}'"
- id: consume-output
name: consume output
shell: pwsh
run: |
$json = '${{ steps.define-output.outputs.myjson }}'
$data = $json | ConvertFrom-Json
write-host ($data| ConvertTo-Json)
write-host "base64 = '$([System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($json)))'"
"consume output" 步骤的输出如下所示:
[v] consume output
1 Run write-host "left = '***'"
9 left = '***'
10 right = '***'
11 [
12 ***
13 "variable1": "hello1"
14 ***,
15 ***
16 "variable1": "hello2"
17 ***
18 ]
19 base64 = 'W3sidmFyaWFibGUxIjoiaGVsbG8xIn0seyJ2YXJpYWJsZTEiOiJoZWxsbzIifV0='
请注意,
***
掩码只是在
日志文件中添加的混淆,而不是变量值本身。如果你解码base64字符串,则会得到:
[{"variable1":"hello1"},{"variable1":"hello2"}]
因此,您可以看到变量的值与预期相同。
还要注意,只有在步骤中引用秘密时才会发生掩码操作-例如,如果您从“激活掩码”步骤中删除这些行,则它将停止遮盖值,即使工作流的范围仍然定义了秘密:
为了停止遮蔽,你需要停止引用任何等于值
{
和
}
的操作密钥。
奖励回合
请注意,由于恶意输入,我的Action中存在注入漏洞,用于特殊制作的JSON值 - 例如,如果我可以以某种方式使您的JSON变量1的值最终成为这个神秘的字符串(例如,通过将其作为用户输入提供给您):
}]';write-host aaa;$y='
那么上述操作将会执行以下PowerShell命令:
$json = '[{"variable1":"}]';write-host aaa;$y='}]'
这相当于
$json = '[{"variable1":"}]';
write-host aaa;
$y='}]'
这将实际执行write-host aaa;
作为命令,而不是将其视为输入数据。
为了避免这种情况,您可能需要考虑将输出作为base64编码的字符串传递 - 例如:
- id: define-output
...
$base64 = [System.Convert]::ToBase64String(
[System.Text.Encoding]::UTF8.GetBytes(
($array1 | ConvertTo-JSON -Compress)
)
)
write-host "::set-output name=myjson::$base64"
- id: consume-output
...
$base64 = '${{ steps.define-output.outputs.myjson }}'
$json = [System.Text.Encoding]::UTF8.GetString(
[System.Convert]::FromBase64String(
$base64
)
)
那样,您的JSON数据就不会意外地被晋升为可执行的代码...
$array1
包含什么? - Mathias R. JessenConvertTo-Json
... - Mathias R. Jessen{
或}
的Secret,那么输出结果会有点奇怪... - mclayton