回顾
继上周修复了一波紧急漏洞之后,逐渐分析出一些规律,黑客发掘命令注入漏洞,大多采用反引号(`)包裹脚本命令做一些命令攻击。意识到这些之后,发觉除了要了解单双引号的区别外,还得熟悉反引号的意义,这样才能更好的防范命令注入漏洞的产生。
分析
字符串以单(')、双(")或倒引号(`)围住分别有不同的义意。
1、单引号
例如:
$str = 'An apple a day keeps the docter away.'
当字符串出现 ' 符号时,必须加上反斜杠(\)转义,或者用双引号(")包裹:
'I'm wing'
应改成:
'I\'m wing'
或者
"I'm wing"
才对,其中 ' 即称为跳脱字符 (escape character)。
2、双引号
以双引号围住的字符串 PHP 会对该字符串做 variable interpolation 的动作,亦即做变量的取代:
$name = "Wing";
echo 'Name: $name';
echo "Name: $name";
执行结果为:
Name: $name
Name: Wing
在双引号里的字符串如果有 $ (dollar sign),只要改成跳脱字元的写法即可:
$total = 12000;
echo "Total: $ $total"; //输出 Total: $ 12000
在做 variable interpolation 时,变量名称是以一个以上空格做为界线,例如:
$n_file = 5;
if ($n_file == 1) {
echo "There are $n_file.";
} else {
echo "There are $n_files.";
}
当 n_files." PHP 所看到的变量为 n_file,所以必须改成:
$n_file = 5;
if ($n_file == 1) {
echo "There are $n_file.";
} else {
echo "There are {$n_file}s.";
}
单引号内的双引号,或是双引号内的单引号都视为有效字符,不需使用跳脱字符,例如:
echo "I'm a happy bird.";
echo 'I\'m a happy "bird"!';
输出结果为:
I'm a happy bird.
I'm a happy "bird"!
3、反引号
利用反引号可以执行 Unix 下的命令,并传回执行结果。例如:
echo `ls -l *.txt`;
表示将 ls -l *.txt 命令的执行结果输出,以反引号围住的字符串为要执行的 UNIX 指令。