Bash - 安全脚本

时间:2013-06-06 21:25:26

标签: apache bash

我对bash脚本中的安全性有一些疑问。

我有一个名为test.sh的脚本,它看起来像

#!/bin/bash
cat "$1"

是的,非常棒且无辜的脚本......但是当用户(就像使用这个cgi脚本的网络用户)给我一个像 " ; rm -rf /*"或使用命令替换"`rm -rf / * `"这不是一个好的情况。

所以,这是一个小测试:

touch test; ./test.sh " ; `rm test`" &>/dev/null; [[ -f "test" ]] && echo ":)" || echo ":("

这将打印悲伤的脸。

我知道脚本的执行应该像一些具有受限权限的预定义用户(如apache)一样运行。即使通过此选项访问网站空间文件或资源也存在安全风险。

这可以通过一些正则表达式等在每个脚本中轻松解决......但是,这是真的应该在脚本中解决的吗?还是在apache和linux中?

1 个答案:

答案 0 :(得分:3)

这不是您脚本中的错误。您的调用等同于

rm test
./test.sh " ; "

没有任何内容可以传递给$1,导致test.sh执行任意命令。

除了能够阅读任何文件,包括/dev/zero之类的无限文件以及可能阻止/dev/stdin之类的文件外,唯一可能的问题是您可以传入选项,例如{{1} }。

可以避免这种情况
-v

Bash脚本本身通常是数据安全的,但是像SQL注入和system()调用一样,注入攻击可能发生在例如cat -- "$1" sedawk以及大量其他命令未正确使用,引用错误可能会触发逻辑错误。

这些东西很少与tar`..`等shell语法有关,而且更像是与“w foo”等看似无辜的字符串相关,因此很难在更高级别上进行过滤。