javascript - 有没有一种安全的方法来防止 exec 剥离引号?
问题描述
我想通过节点的子进程 exec 方法运行一个命令,该方法将包含一个 JSON 字符串,该字符串本身将包含引号字符。似乎 exec 默认情况下会删除这些。有没有办法防止这种情况?
我正在尝试在 netlify 中自动创建构建挂钩,作为我们目前正在尝试构建的一些自动化 QA 的一部分。目前,我正在使用 netlify cli 执行此操作,特别是他们的netlify api createSiteBuildHook
方法。我想捕获此命令的输出并将一些数据注入命令中,因此我尝试使用节点的子进程exec()
命令来解决此问题。我在这里遇到的问题是 netlify 命令需要一个 JSON 字符串作为命令的参数,事实证明,exec 默认情况下会去掉引号,我假设是出于安全原因。我希望有办法解决这个问题。
我尝试并考虑过的一些替代方案:
- 我之前尝试过使用 netlify api js 客户端来解决这个问题,但是我们遇到了自动刷新 api 令牌的问题。这是作为 CircleCI 中自动构建过程的一部分运行的,因此它从任何交互中抽象出来。我想避免开发人员每次因为超出速率限制或其他原因而导致构建和自动测试停止工作时都必须手动更新。
- 我试过使用转义引号,例如
\"
,^"
等无济于事。 - 我尝试过使用替代子进程方法,如 spawn 或 execFile 但我似乎遇到了同样的问题。
- 最后一种选择是将其完全抽象为 bash。这并非完全不可行,它只是繁琐和烦人。我必须将输出保存在一个文件中,然后加载该文件并在我想要获取新生成的构建挂钩等的 url 时对其进行查询。如果我可以在 js 中完成这项工作,它将节省大量时间。
我用来生成构建钩子的命令:
yarn netlify api createSiteBuildHook -d {"site_id":"my-site-id","body":{"title":"my-title","branch":"my-branch"}}
我用来通过 exec 运行它的代码:
yargs
.command(
'createBuildHook',
'Creates a build hook in netlify',
{},
async () => {
const buildHookRequest = JSON.stringify({
site_id: process.env.NETLIFY_MASTER_ID,
body: {
title: branchName(),
branch: branchName(),
}
});
const cmd = exec(`yarn netlify api createSiteBuildHook -d ${buildHookRequest}`, (err, stout) => {
if (err) {
console.log(`Error: ${err}`);
}
console.log(`Output: ${stout}`);
});
}
)
.demandCommand().argv;
尝试运行命令时出现的错误:
$ yarn qa-automate:createBuildHook
yarn run v1.16.0
$ yarn qa-automate createBuildHook
$ babel-node --presets @babel/preset-env -- ./qa-automation/cli.js createBuildHook
Error: Error: Command failed: yarn netlify api createSiteBuildHook -d {"site_id":"my-site-id","body":{"title":"my-title","branch":"my-branch"}}
SyntaxError: Unexpected token s in JSON at position 1
at JSON.parse (<anonymous>)
at APICommand.run (C:/Users/owen_jones/web-work/website-assets/node_modules/netlify-cli/src/commands/api.js:45:61)
error Command failed with exit code 1.
Output: $ C:\Users\owen_jones\web-work\website-assets\node_modules\.bin\netlify api createSiteBuildHook -d {site_id:my-site-id,body:{title:my-title,branch:my-branch}}
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
Done in 3.92s.
您可以在输出中看到它已去除引号。可能是其他东西在剥离,但我不知道是什么。
解决方案
不是exec
,是壳。
您可以通过使用反斜杠转义每个引号(和反斜杠)来解决它:
const cmd = exec(`yarn netlify api createSiteBuildHook -d ${buildHookRequest.replace(/[\\"]/g, "\\$&")}`, (err, stout) => {
这可能不是一个强大的通用解决方案,但对于您正在做的事情可能已经足够了。(我的快速本地测试很好地通过了 JSON。)
推荐阅读
- javascript - 与其他组件共享组件数据
- amazon-web-services - 如何在 serverless.yml 上设置 S3 对象的元数据
- linux - Apache 服务器上的 403 错误
- c# - PInvokeStackImbalance - 当我在 C# 中调用 delphi 函数时
- security - Identity Server 4 asp.net 2.1 - IProfileService 或替代
- python - 如何在 mogodb 中查询一个纪元时间戳的日期
- c# - 导航视图不会打开不同的表单
- html - 链接在 Firefox 中中断但在 Chrome 中没有
- php - 我的函数无法将数据插入数据库
- react-native - 连接域和应用程序逻辑以在 UI 中呈现实体