Есть ли безопасный способ предотвратить взлом кавычек exec? - PullRequest
1 голос
/ 30 октября 2019

Я хочу запустить команду через метод exec дочернего процесса узла, который будет включать строку JSON, которая сама будет содержать символы кавычек. Похоже, что exec удаляет их по умолчанию. Есть ли способ предотвратить это?

Я пытаюсь автоматизировать создание хуков сборки в netlify как часть некоторого автоматизированного контроля качества, который мы сейчас пытаемся построить. В настоящее время я делаю это, используя 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.

В выводе вы можете видеть, что он отбросил кавычки. Может быть, что-то еще делает зачистку, но я не могу понять, что.

1 Ответ

1 голос
/ 30 октября 2019

Это не exec, это оболочка.

Вы, вероятно, можете обойти это, избегая каждой цитаты (и обратной косой черты) с обратной косой чертой:

const cmd = exec(`yarn netlify api createSiteBuildHook -d ${buildHookRequest.replace(/[\\"]/g, "\\$&")}`, (err, stout) => {

Это, вероятно, ненадежное универсальное решение, но оно, вероятно, достаточно хорошо для того, что вы делаете. (Мой быстрый локальный тест прошел через JSON достаточно хорошо, делая это.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...