gpt4 book ai didi

powershell - 如何安全地将字符串文字参数传递给 powershell.exe

转载 作者:行者123 更新时间:2023-12-05 06:50:21 24 4
gpt4 key购买 nike

当从另一个环境(例如 Java)调用 PowerShell 脚本时,文字字符串参数需要作为过程参数的一部分传递。

如何清理或转义将作为字符串文字传递给 PowerShell 调用的用户输入?

我在任何地方都找不到完整的指南。

最佳答案

用单引号将文字括起来

  • 用双单引号替换现有的单引号
  • 删除(或失败)`0(零)个字符 - powershell 可以在内部处理它们,但不能将它们传递给子进程
  • (根据您的程序执行的操作,您可能还想删除低于 32 甚至高于 127 的输入。但这与编码无关)

这就是所有人。

参数:单个字符串与数组

我建议将所有参数作为一个空格分隔的字符串传递,即使您使用接受字符串数组的进程启动 API。

如果您传递一个参数数组,PowerShell 将只用单个空格将它们连接起来,然后根据自己的逻辑再次将它们分开。 (即使一个参数以引号开头而另一个参数以引号结尾,这仍然有效。)

传递一组参数只会让代码变得丑陋,掩盖实际发生的事情,并可能提供错误的安全感。

测试字符串参数传递的正确性

  • 尝试在一行中添加多个空格:正确使用时,它们会被准确保留
  • 尝试在括号中传递值:
    • 如果正确传递,它们将作为文字传递
    • 否则,PowerShell 会尝试执行括号中的值,例如powershell.exe write-host "a b (c)" 导致错误:“无法识别术语 'c'”
    • 警告:在 `(c`) 中转义圆括号似乎是一种解决方案,但实际上只是掩盖了一个错误:参数未被识别为字符串字面意思。
  • 尝试添加特殊字符

提示 当从另一个 shell(如 cmd.exe 或 bash)调用 powershell.exe 时,不要混淆该 shell 的解析和 PowerShell 的解析。例如,引号限制了 cmd.exe 或 bash 的参数,但参数在没有引号的情况下传递给 PowerShell。这可能会导致一些困惑。

关于powershell - 如何安全地将字符串文字参数传递给 powershell.exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66419641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com