在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
学shell到现在了,一直以为自己不会犯一个大家常说的非常二的问题,结果这本书最后的时候犯了个十分2的事,晚节不保啊!!!我在测试文件路径下除了通配符*和?外还能用啥正则那样的东西,结果就在$HOME下执行了rm .* 。。。好吧,蛋疼了一下午!还木找回任何一个配置文件。警示后人,千万别使用rm试通配符!任何时候小心使用rm!
第十五章安全的shell脚本:起点
复制代码 代码如下: logger(){ printf "%s\n" "$*" >> /var/adm/logsysfile } logger "Run by user " $(id -un) "($USER) at " $(/bin/date) 9、当使用该输入时,一定将用户输入引用起来。例如:"$1"与"$*",这么做可以防止居心不良的用户输入超出范围的计算与执行。 10、勿在用户输入上使用eval。甚至在引用用户输入之后,也不要使用eval将它交给shell再处理。如果用户读取了你的脚本,发现你使用eval,就能很轻松的利用这个脚本进行任何破坏。 11、引用通配符展开的结果。你可以将空格、分号、反斜杠等放在文件名里,让棘手的事情交给系统管理员处理。如果管理的脚本未引用文件名参数,此脚本将会造成系统的问题。 12、检查用户输入是否有meta字符。如果使用eval或$(...)里的输入,请检查是否有像$或`这类的meta字符。 13、检测你的代码,并小心谨慎阅读它。寻找是否有可被利用的漏洞与错误。把所有坏心眼的想法都考虑进去,小心研究你的代码,试着找出破坏它的方式,再修正发现的问题。 14、留意竞争条件(race condition)攻击者是不是可以在你脚本里的任两个命令之间执行任意命令,这对安全性是否有危害?如果是,换个方式处理你的脚本。 15、对符号性连接心存怀疑。在chmod文件或是编辑文件时,检查它是否真的是一个文件,而非连接到某个关键性系统文件的符号性连接(利用[ -L file ] 或 [ -h file ]检测file是否为一符号性连接。 16、找其他人重新检查你的程序,看看是否有问题。 17、尽可能用setgid而不要用setuid。这些术语稍后讨论,简之就是使用setgid能将损害范围限制在某个组内。 18、使用新的用户而不是root。如果你必须使用setuid访问一组文件,请考虑建立一个新的用户,非root的用户做这件事并设置setuid给他。 19、尽可能限制使用setuid的代码。尽可能让setuid代码减到最少。将它移到一个分开的程序,然后在大型脚本里需要时才引用它。无论如何,请做好代码防护,好像脚本可以被任何人于任何地方引用那样。 20、一个安全shell的开场白: 复制代码 代码如下: IFS=' \t\n' #之前几篇见过很多次 unset -f unalias #确保unalias不是一个函数 \unalias -a #unset all aliases and quote unalias so it's not alias-expanded unset -f command #确保调用的command不是以函数 #获得可靠的路径前缀,处理getconf不可用的情况。 #get a reliable path prefix,handling case where getconf is not available. SYSPATH="$(command -p getconf PATH 2>/dev/null))" if [[ -z "$SYSPATH" ]];then SYSPATH="/usr/bin:/bin" fi PATH="$SYSPATH:$PATH" 这段代码使用了许多非POSIX的扩展,需要注意。 该书最后给出了如何编写自己的shell程序的manual,和unix的文件和文件系统的介绍。至此该书通读完毕。 |
请发表评论