Bash函数无参时退出及参数注入风险技术咨询
问题解答
1. 实现无参数时退出函数并跳过awk命令
原函数仅在无参数时打印提示,但仍会执行后续awk命令。只需在打印提示后添加return语句(函数内退出用return,避免终止整个shell),即可终止函数执行,跳过awk部分。
修改后的完整代码:
wapi-lseq () { ## Print text with colour according to line number position (( $# == 0 )) && { printf '%s\n' "See 'firefly-wapi-kcard-klue'" return } awk -v ctp="$1" -v rst="$2" -v lseq="$3" \ 'BEGIN { ## Store LNUM sequence as index to array laggr fm1="%s%s%s\n" ; fm2="%s\n" n = split(lseq, a, ",") for ( i=1 ; i<=n ; i++ ) laggr[a[i]] } { ## When NR is an index in array, use colour sequence ctp if (NR in laggr) printf(fm1, ctp, $0, rst) else printf(fm2, $0) }' } # wapi-lseq ends here
用{}包裹打印和return语句,确保条件成立时两者都执行。
2. 参数被攻击者控制时的注入风险分析
你当前使用awk -v var="$param"的方式传递变量,不存在awk代码注入风险,原因如下:
-v是awk官方提供的安全传参方式,它会将外部变量值作为纯字符串传递,不会将其解析为awk脚本代码执行。- 即使攻击者在$1、$2、$3中传入包含awk语法或恶意命令的内容(比如
"; system('rm -rf /'); "),这些内容只会被当作变量的普通值处理,不会触发恶意执行。
如果是直接将变量嵌入awk脚本(比如awk '{print "'$1'"}'),则会存在注入风险,但你的写法完全规避了这个问题。
内容的提问来源于stack exchange,提问作者Dilna
相关产品推荐
相关产品推荐

