資料入庫時,我們需要對字串和二進位制型別的資料進行轉義。主要的目的是轉義一些特殊字元,比如 \0、'、"、\n 等等,讓 sql 語句得以正確執行,同時也能起到防止 sql 注入的作用。
函式原型
引數 to 的長度最少為:length*2+1。因為最壞的情況下每個位元組都需要轉義,再加上最後的 \0 。
返回轉義後字串的長度,不包括 \0 。
示例mysql *handler = ::mysql_init(nullptr);
::mysql_options(handler, mysql_set_charset_name, "utf8"); // 指定編碼
::mysql_real_connect(...);
const char *from = "待轉義字串";
int length = strlen(from);
char *to = new char[length*2+1];
::mysql_real_escape_string(handler, to, from, length); // 轉義
服務端程式設計
由於查詢操作會阻塞執行執行緒,因此在服務端程式設計中邏輯執行緒通常只負責拼接 sql 語句,然後將其傳送給資料庫操作執行緒等待執行。這就意味著轉義和查詢發生在不同執行緒,那麼它們能共享同乙個連線呢?
答案是肯定的。
考察 mysql_real_escape_string 的原始碼實現,會發現它只使用了資料庫連線的編碼屬性,而且沒有對其它任何屬性做任何判斷和處理,這個過程中也不會發生網路資料傳輸和重連等阻塞操作。
即便該連線在資料庫操作執行緒中發生重連,連線物件也只是被賦值而不是被銷毀,而且賦值前後編碼屬性一致。(參考原始碼中 mysql_reconnect 的實現)
其它
SQL注入準備(MySQL查詢語句 URL編碼)
select user 當前mysql 登入使用者名稱 select database 當前mysql 資料庫名 select version 當前mysql 版本 select version 當前mysql 版本 select basedir 當前mysql 安裝路徑 mysql安裝目錄 sel...
mysql 報錯注入語句 mysql注入
sql的注入型別有以下5種 boolean based blind sql injection 布林型注入 error based sql injection 報錯型注入 union query sql injection 可聯合查詢注入 stacked queries sql injection ...
mysql注入總結 mysql注入總結
4.相關函式 system user 系統使用者名稱 user 使用者名稱 current user 當前使用者名稱 session user 連線資料庫的使用者名稱 database 資料庫名 version mysql資料庫版本 load file mysql讀取本地檔案的函式 datadir ...