表 3 shell 脚本中常用的与命令注入相关的特殊字符。
| 分类 | 符号 | 功能描述 | 
| 管道 | | | 连结上个指令的标准输出,作为下个指令的标准输入 | 
| 内联命令 | ; | 连续指令符号 | 
| 内联命令 | & | 单一个 & 符号,且放在完整指令列的最后端,即表示将该指令列放入后台中工作 | 
| 逻辑操作符 | $ | 变量替换 (Variable Substitution) 的代表符号 | 
| 表达式 | $ | 可用在 ${} 中作为变量的正规表达式 | 
| 重定向操作 | > | 将命令输出写入到目标文件中 | 
| 重定向操作 | < | 将目标文件的内容发送到命令当中 | 
| 反引号 | ` 对 | 可在 ` 和 ` 之间构造命令内容并返回当前执行命令的结果 | 
| 倒斜线 | \ | 在交互模式下的 escape 字元,有几个作用;放在指令前,有取消 aliases 的作用;放在特殊符号前,则该特殊符号的作用消失;放在指令的最末端,表示指令连接下一行 | 
| 感叹号 | ! | 事件提示符 (Event Designators), 可以引用历史命令 | 
| 换行符 | \n | 可以用在一行命令的结束,用于分隔不同的命令行 | 
 
上述字符也可能以组合方式影响命令拼接,如管道符 “||”,“>>” ,“<<”,逻辑操作符 “&&” 等,由于基于单个危险字符的检测可以识别这部分组合字符,因此不再列出。另外可以表示账户的 home 目录 “~”,可以表示上层目录的符号“..”,以及文件名通配符 “?” (匹配文件名中除 null 外的单个字元),“*” (匹配文件名的任意字元) 由于只影响命令本身的语义,不会引入额外的命令,因此未列入命令注入涉及的特殊字符,需根据业务本身的逻辑进行处理。
| 操作符 | 溢出 | 操作符 | 溢出 | 操作符 | 溢出 | 操作符 | 溢出 | 
+ | Y | -= | Y | << | N | < | N | 
- | Y | *= | Y | >> | N | > | N | 
* | Y | /= | Y | & | N | >= | N | 
/ | Y | %= | N | | | N | <= | N | 
% | N | <<= | N | ^ | N | == | N | 
++ | Y | >>= | N | ~ | N |  |  | 
-- | Y | &= | N | ! | N |  |  | 
= | N | \|= | N | != | N |  |  | 
+= | Y | ^= | N | ** | Y |  |  | 
 
| CangJie   Type | C Type | Size | 
| Unit | void | 0 | 
| Bool | bool | 1 | 
| Int8 | int8_t | 1 | 
| UInt8 | uint8_t | 1 | 
| Int16 | int16_t | 2 | 
| UInt16 | uint16_t | 2 | 
| Int32 | int32_t | 4 | 
| UInt32 | uint32_t | 4 | 
| Int64 | int64_t | 8 | 
| UInt64 | uint64_t | 8 | 
| IntNative | - | *   platform dependent | 
| UIntNative | - | *   platform dependent | 
| Float32 | float | 4 | 
| Float64 | double | 8 | 
| struct | struct | field   dependent | 
 
- 
Kotlin 编码规范
 
- 
Swift 编码规范
 
- 
华为 Java 编码规范 V5.0
 
- 
华为 C++ 语言编程规范 V5.0(试行)