是否有一种简单的方法可以将用户数据清理为bash脚本?

时间:2012-08-14 23:12:29

标签: linux bash centos sanitization

我有一个简单的脚本,它从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

3 个答案:

答案 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运行它。