當我們在處理由客戶端傳來的數據時,為了防止SQL注入攻擊及其他安全問題,需要對這些數據進行轉義并處理。php提供了 addcslashes 和 addslashes函數,功能都是對字符串中的特殊字符進行轉義。而在實際使用中,由于addslashes轉義的字符集合不完整,所以一些較為少見的特殊字符并沒有被轉義,因此建議使用 addcslashes 或者其他安全的方式進行防注。
addslashes 函數用于將字符串中一些特殊字符加上反斜線,以便于安全地執行 MySQL 語句。不過需要注意的是,addslashes 函數僅僅是針對單引號、雙引號、反斜線和 NUL 這四個字符進行轉義,對于一些其他的特殊字符如 \x00、\x1a則無法轉義,因此在進行應用時需要特別注意。以下是一個示例:
$str = "張三'"; echo addslashes($str); // 輸出:張三\'
而當要轉義的字符串中含有像回車符、換行符這樣的ASCII字符,我們需要用 addcslashes 函數進行處理,因為addslashes 不會轉義這些字符。
$str = "張三\n"; echo addslashes($str); // 輸出:張三\ echo addcslashes($str, "\0..\37!@\177..\377"); // 輸出:張三\n
在使用一些框架、ORM 工具,甚至是自己編寫的代碼時,很多時候可能是使用的都是 ORM::escape 方法自動轉義數據。例如,ThinkPHP 中定義轉義方法為:escape,而 Laravel 是通過 QueryBuilder 或 Model Eloquent 內部完成轉義操作。
use Illuminate\Support\Facades\DB; $user = DB::table('users')->where('name', '=', "Bob'")->get();
使用Query Builder 或 ORM 框架操作數據庫時,這些工具一般都會自動地處理數據轉義的問題。不過,在有些時候,我們需要進行數據的轉義操作,處理一些敏感字符。此時,依舊可以使用addcslashes 或 addslashes ,不過建議使用其他更加安全的函數代替。
除了手動對字符串進行轉義之外,php 7 之后標準庫中新增了一個類 Filter ,其中的 addslashes 函數和之前的 addcslashes 類似,可以一次性地對多個字符串進行轉義。
use FilterIterator; class EscapeIterator extends FilterIterator { public function current() { return addslashes(parent::current()); } public function accept() { return is_string(parent::current()); } } $array = ['1', '2\n', '3\'']; $it = new EscapeIterator(new ArrayIterator($array)); foreach ($it as $key =>$val) { echo $key . ' =>' . $val . "\n"; }
總之,php 中的轉義操作對于保證程序的安全性是至關重要的,因此我們需要選擇合適的方法進行轉義。