我有一個簡單的 SQLITE 資料庫和來自 BASH 的作業查詢,如下所示:
/usr/local/bin/sqlite3 $database "INSERT INTO ac VALUES (NULL, datetime('now', 'localtime'),'`echo $QUERY_STRING|cut -f2 -d'&'`','`echo $QUERY_STRING|cut -f3 -d'&'`','`echo $QUERY_STRING|cut -f4 -d'&'`','`echo $QUERY_STRING|cut -f5 -d'&'`','`echo $QUERY_STRING|cut -f6 -d'&'`','`echo $QUERY_STRING|cut -f7 -d'&'`');"
我的 QUERY_STRING 是:
QUERY_STRING="u=bbaacc&1&233.90&0.11&0.00&8.35&0.00"
如何簡化這個查詢?我認為有一個簡單的解決方案,但我找不到。將來我的 QUERY_STRING 會變大,看起來像這樣:
QUERY_STRING="u=bbaacc&1&233.90&0.11&0.00&8.35&0.00&2&233.80&0.07&0.80&0.00&0.05&3&233.70&0.07&0.90&0.00&0.05"
uj5u.com熱心網友回復:
您想要查詢字串中的第二個到第七個“欄位”(可以這么說)?我會awk用來做拆分選擇合并操作:
params="'$(echo "$QUERY_STRING" | awk -F '&' -v OFS="','" '{print $2, $3, $4, $5, $6, $7}')'"
該awk程式在 上拆分欄位&,并','在它們之間列印 2 到 7 (輸出欄位分隔符)。開頭和結尾也有單引號,在整體之外$( )。
然后在實際查詢中使用它:
/usr/local/bin/sqlite3 "$database" "INSERT INTO ac VALUES (NULL, datetime('now', 'localtime'),$params);"
請注意,我建議使用小寫或混合大小寫的變數名稱(即query_string代替QUERY_STRING)以避免與許多具有特殊含義的全大寫名稱發生沖突。此外,您應該幾乎總是雙引號變數參考(例如,echo "$QUERY_STRING"而不是echo $QUERY_STRING)以避免奇怪的決議。我總是建議通過shellcheck.net運行腳本來檢查缺少雙引號之類的錯誤。
順便說一句,由于它QUERY_STRING看起來很像來自 URL,因此來自某些網路客戶端,因此它可能來自不可信的來源。將不受信任的資料直接放入 SQL 查詢中是獲取 SQL 注入漏洞的經典方法(強制相關 xkcd)。您應該確保在將資料靠近資料庫之前對其進行驗證。
如果我理解字串的格式,這樣的事情應該可以作業:
valid_query='^u=[.&[:alnum:]] $'
if [[ ! "$QUERY_STRING" =~ $valid_query ]]; then
echo "Bad query, cancelling." >&2
exit or return or something
fi
[do the actual query here]
該正則運算式模式查找以“u=”開頭的內容,然后混合了“.”、“&”、字母和數字。所有這些字符都應該是安全的,可以在不允許注入的情況下進行查詢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/311401.html
