我有一个简单的脚本,它从STDIN(管道电子邮件)获取主题行和返回路径,并使用主题运行自定义卷曲查询:
#!/usr/bin/env bash
# Check for the sender email address and subject.
# Assign them to variables for use later.
while read -r key value; do
case $key in
Subject:) subject=$value;;
Return-Path:) return_path=$value;;
esac
done
# Run a curl query utilizing a modified version of the subject (replacing spaces with plus symbols)
curl "https://foo.com/&q="${subject// /+}"" >> foo.txt
我担心的是,这会为恶意(或偶然)使用有问题的主题标题留下漏洞,例如:主题:测试123; rm -fr /;
是否有一种简单的方法可以防止这种情况发生?
如果这是一个模糊的问题,我道歉。我对脚本非常陌生,所以我对脚本强化/消毒的知识非常渺茫。如果有初学者的参考,请告诉我。
更新。这是经过修改的脚本:
#!/usr/bin/env bash
# Check for the sender email address and subject.
# Assign them to variables for use later.
while read -r key value; do
case $key in
Subject:) subject="$value";;
Return-Path:) return_path="$value";;
esac
done
# Run a curl query utilizing a modified version of the subject (replacing spaces with plus symbols)
curl "https://foo.com/&q=\"${subject// /+}\"" >> foo.txt
答案 0 :(得分:3)
是。始终使用报价。 始终强>
foo="$bar"
答案 1 :(得分:1)
curl可以为你编写urlencode。
while read -r key value; do
case $key in
Subject:) subject=$value;;
Return-Path:) return_path=$value;;
esac
done
curl --get --data-urlencode "q=$subject" "https://foo.com/" >> foo.txt
无论主题包含什么内容,它都不会被视为代码。
答案 2 :(得分:1)
我很遗憾地说目前接受的答案是错误的。正如geirha指出的那样,不需要在作业周围引用。
但改变
curl "https://foo.com/&q=\"${subject// /+}\"" >> foo.txt
到
curl "https://foo.com/&q=${subject// /+}" >> foo.txt
除非你通过两个shell运行数据,否则没有“应用两个级别的引用”。
阅读sh spec的第2.2.1至2.2.3节,以了解引用的工作原理。另请阅读2.6.5“字段拆分”以了解如何拆分不在双引号中的变量。
在任何情况下都不是外部输入视为命令可以输入“注入”命令,除非你信任它并通过另一个shell运行它。