Переменная не расширяется в двойных кавычках для сценария bash - PullRequest
0 голосов
/ 13 января 2020

У меня есть сценарий bash, где я пытаюсь вызвать curl, который имеет значение переменной в качестве ввода. При попытке выполнить скрипт bash значение переменной не раскрывается в двойных кавычках.

Ожидаемое скручивание в скрипте после раскрытия переменной должно быть следующим:

/usr/bin/curl -s -vvvv http://hmvddrsvr:8044/query/service -u iamusr:pssd -d 'statement=DELETE FROM `test_bucket` WHERE type = "Metadata" AND market = "ES" AND status = "active" AND meta(test_bucket).id="fgsd34sff334" '

При выполнении в режиме отладки выполняется следующее:

/usr/bin/curl -s -vvvv http://hmvddrsvr:8044/query/service -u iamusr:pssd -d 'statement=DELETE FROM `test_bucket` WHERE type = "Metadata" AND market = "ES" AND status = "active" AND meta(test_bucket).id=\""$idp_sub"\" '

My bash Сценарий выглядит следующим образом:

#!/bin/bash

idp_sub=""


for idp_sub in $(cat /opt/SP/jboss/home/mayur/es_idp_sub.txt)

do

/usr/bin/curl -s -vvvv http://hmvddrsvr:8044/query/service -u iamusr:pssd -d 'statement=DELETE FROM `test_bucket` WHERE type = "Metadata" AND market = "ES" AND status = "active" AND meta(test_bucket).id=\""$idp_sub"\" ' -o  /opt/SP/jboss/home/mayur/es_delete_response.txt


done

Как расширить значение переменной в двойных кавычках, как показано выше в ожидаемом результате?

Ответы [ 2 ]

1 голос
/ 13 января 2020

Ваша строка в двойных кавычках находится внутри одинарных кавычек, где она не будет расширена.

Сравните:

foo=bar
echo 'foo=\""$foo\"'
echo 'foo="'"$foo"'"'

Во втором примере мы заканчиваем одинарные кавычки, и двойная кавычка $foo, затем начните новые одинарные кавычки для финала '.

Вероятно, будет легче читать, если мы расширим, используя printf вместо:

printf 'foo=%s\n' "$foo"

Это что-то Возможно, вы захотите запустить процесс подстановки.

НО ...

Это неверный и опасный способ создания SQL запрос (и веб-сервер также плохой, если он перенаправляет произвольные запросы - я надеюсь, что у него нет прав на запись данных). Прочитайте о «SQL инъекция команды » и вернитесь к этому коду, когда разберетесь в проблемах.

0 голосов
/ 13 января 2020

Ничто внутри одинарных кавычек не будет расширено на bash, включая любые двойные кавычки и имена переменных. Хорошей новостью является то, что вы можете завершить раздел с одинарными кавычками и сразу же начать раздел с двойными кавычками, чтобы ввести переменную, и все это будет объединено в один аргумент для приложения (curl). Попробуйте:

/usr/bin/curl -s -vvvv http://hmvddrsvr:8044/query/service -u iamusr:pssd -d 'statement=DELETE FROM `test_bucket` WHERE type = "Metadata" AND market = "ES" AND status = "active" AND meta(test_bucket).id=\"'"$idp_sub"'\" ' -o  /opt/SP/jboss/home/mayur/es_delete_response.txt

Вы можете сделать свой код полностью защищенным от инъекций, отклонив любую строку, содержащую двойные кавычки, но вы можете отклонить некоторые строки, которые законно экранированы.

Если вы можно использовать синтаксис q для цитирования строки, вы можете сделать ее более защищенной от инъекций, но я полагаю, что злоумышленнику просто нужно ввести ]":

/usr/bin/curl -s -vvvv http://hmvddrsvr:8044/query/service -u iamusr:pssd -d 'statement=DELETE FROM `test_bucket` WHERE type = "Metadata" AND market = "ES" AND status = "active" AND meta(test_bucket).id=q\"['"$idp_sub"]'\" ' -o  /opt/SP/jboss/home/mayur/es_delete_response.txt

Затем вы можете найти и отклонить шаблон string ]" как ваш антиинъекционный код, который позволит использовать более широкий класс допустимых строк. Вы должны будете сказать пользователям, что вы применили к их вводу кавычки q [], чтобы им не пришлось это делать.

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