【问题标题】:Is there an easy way to santize user data going into a bash script?有没有一种简单的方法来清理进入 bash 脚本的用户数据?
【发布时间】:2012-08-16 02:00:04
【问题描述】:

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

【问题讨论】:

    标签: linux bash centos sanitization


    【解决方案1】:

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

    foo="$bar"
    

    【讨论】:

    • 谢谢。我不太确定如何强化脚本以反映这一点,因为 URL 已经使用引号。我可以在案例部分使用报价吗?
    • 您的网址没有使用引号。是的,您应该在案例部分使用引号。
    • 请原谅我的无知。我更新了示例以包含引号,但我仍然没有看到我在 url 中缺少引号的位置。你能详细说明吗?感谢您的耐心等待。
    • 你的第二个双引号关闭了第一个,使参数扩展完全不加引号。
    • 这将起作用,假设您希望参数值用引号引起来。另外,请注意,有更多字符会破坏此脚本,而不仅仅是空格(例如&+ 等)。
    【解决方案2】:

    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
    

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

    【讨论】:

    • 噢噢噢!我喜欢这个。那么 --data-urlencode 开关可以将空格字符转换为与它们的 HTML 实体代码等效的东西吗?
    【解决方案3】:

    很抱歉,当前接受的答案是错误的。正如 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 运行它。

    【讨论】:

    • 澄清一下,我希望引号在实际的 curl 命令中。这有什么改变吗?我想通过逃避它们,它们会被 shell 忽略。
    • 对不起,忘记包含你的转义,但我很确定你不想处理任何引号来卷曲,这就是为什么我给你提供了更少引号的版本。
    猜你喜欢
    • 2015-08-27
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    相关资源
    最近更新 更多