【PHP防衛(wèi)戰(zhàn)】單引號,雙引號,以及反引號的區(qū)別

回顧

繼上周修復(fù)了一波緊急漏洞之后,逐漸分析出一些規(guī)律,黑客發(fā)掘命令注入漏洞,大多采用反引號(`)包裹腳本命令做一些命令攻擊。意識到這些之后,發(fā)覺除了要了解單雙引號的區(qū)別外,還得熟悉反引號的意義,這樣才能更好的防范命令注入漏洞的產(chǎn)生。

分析

字符串以單(')、雙(")或倒引號(`)圍住分別有不同的義意。

1、單引號

例如:

$str = 'An apple a day keeps the docter away.'

當(dāng)字符串出現(xiàn) ' 符號時,必須加上反斜杠(\)轉(zhuǎn)義,或者用雙引號(")包裹:

'I'm wing'

應(yīng)改成:

'I\'m wing' 

或者

"I'm wing"

才對,其中 ' 即稱為跳脫字符 (escape character)。

2、雙引號

以雙引號圍住的字符串 PHP 會對該字符串做 variable interpolation 的動作,亦即做變量的取代:

$name = "Wing";
echo 'Name: $name';
echo "Name: $name";

執(zhí)行結(jié)果為:

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.";
}

當(dāng) n_file 不為 1 時,"There aren_files." PHP 所看到的變量為 n_files,而不是正確n_file,所以必須改成:

$n_file = 5;
if ($n_file == 1) {
    echo "There are $n_file.";
} else {
    echo "There are {$n_file}s.";
}

單引號內(nèi)的雙引號,或是雙引號內(nèi)的單引號都視為有效字符,不需使用跳脫字符,例如:

echo "I'm a happy bird.";
echo 'I\'m a happy "bird"!';

輸出結(jié)果為:

I'm a happy bird.
I'm a happy "bird"!

3、反引號

利用反引號可以執(zhí)行 Unix 下的命令,并傳回執(zhí)行結(jié)果。例如:

echo `ls -l *.txt`;

表示將 ls -l *.txt 命令的執(zhí)行結(jié)果輸出,以反引號圍住的字符串為要執(zhí)行的 UNIX 指令。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容