0

我有一个简单的脚本,它从 STDIN(管道电子邮件)获取主题行和返回路径,并使用主题运行自定义 curl 查询:

#!/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
4

3 回答 3

3

是的。始终使用引号。总是

foo="$bar"
于 2012-08-14T23:25:54.563 回答
1

很抱歉,目前接受的答案是错误的。正如 geirha 指出的那样,不需要在作业周围引用引号。

但改变

curl "https://foo.com/&q=\"${subject// /+}\"" >> foo.txt

curl "https://foo.com/&q=${subject// /+}" >> foo.txt

除非您通过两个 shell 运行数据,否则没有“应用两个级别的引用”之类的东西。

阅读sh 规范的 2.2.1 到 2.2.3 部分,以更好地了解引用的工作原理。另请阅读 2.6.5 “字段拆分”以了解如何拆分不在双引号中的变量。

在任何情况下,将外部输入视为命令都不能输入“注入”命令,除非您当然信任它并通过另一个 shell 运行它。

于 2012-08-15T09:04:16.360 回答
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

无论主题包含什么内容,都不会被视为代码。

于 2012-08-15T08:24:00.900 回答