簡體   English   中英

bash腳本的變量沒有在雙引號中擴展

[英]Variable not expanding in Double quotes for bash script

我有一個 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"\" '

我的 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

我如何在預期輸出中擴展雙引號內的變量值,如上所示?

您的雙引號字符串位於單引號內,不會被擴展。

相比:

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

在第二個示例中,我們結束單引號和雙引號$foo ,然后為最后的'開始新的單引號。

如果我們使用printf擴展,可能更容易閱讀:

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

您可能希望將其作為進程替換來運行。

但...

這是構造 SQL 查詢的錯誤危險的方式(並且 Web 服務器也很差,如果它轉發任意查詢 - 我希望它沒有對數據的寫權限)。 閱讀“ SQL 命令注入”並在您了解問題后返回此代碼。

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

然后,您可以搜索並拒絕模式字符串]"作為您的反注入,這將允許更多類別的合法字符串。您必須告訴用戶您已將 q[] 引用應用於他們的輸入,因此他們不必。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM