SQLite 防注入及單引號 雙引號處理 C

2021-10-23 11:08:34 字數 4320 閱讀 7987

sqlite 是乙個用c寫的超輕量級的開源資料庫;

cppsqlite3 是對sqlite進行二次封裝後的c++類, 使用時需要依賴 sqlite3 庫及 sqlite3.h;

在 windows 環境下使用這個類的時候,你需要確保幾件事情:

cppsqlite3.h 和cppsqlite3.cpp

sqlite3.h、sqlite3.lib 和 sqlite3.dll (windows環境)

2. 工程中引入 sqlite3.lib,最後要將cppsqlite3.h 和cppsqlite3.cpp新增到工程中

// 製作 cppsqlite3 動態庫

#ifdef ***lib_exports

# define ***_api __declspec(dllexport)

#else

# define ***_api __declspec(dllimport)

#endif

新增匯出巨集 ***_api 及 [改進版]新增的 5 個函式

// cppsqlite3.h   

//1. 類名前面增加匯出符號 ***_api

class

***_api cppsqlite3exception

class

***_api cppsqlite3buffer

class

***_api cppsqlite3binary

class

***_api cppsqlite3query

class

***_api cppsqlite3table

class

***_api cppsqlite3statement // 這個是預編譯,防注入用的

class

***_api cppsqlite3db

// 2. cppsqlite3db 類中增加 5 個函式

const

char

*get_errormsg()

;int

get_errorcode()

;unsigned

intop_begin

(const

char

*src_dbfile,

const

char

*asdb)

;unsigned

int(

const

char

*src_table,

const

char

*dst_table,

const

char

*key,

const

char

*asdb)

;unsigned

intop_end

(const

char

*asdb)

;// 下面是對應的函式實現, 在 cppsqlite3.cpp 中增加

const

char

* cppsqlite3db::

get_errormsg()

int cppsqlite3db::

get_errorcode()

//unsigned

int cppsqlite3db::

op_begin

(const

char

*src_dbfile,

const

char

*asdb)

ierror =

execdml

("begin transaction;");

return0;

}unsigned

int cppsqlite3db::

(const

char

*src_table,

const

char

*dst_table,

const

char

*key,

const

char

*asdb)

int ierror =0;

char sql[

512];if

(key)

sprintf_s

(sql,

sizeof

(sql)

,"insert into %s select a.* from %s.%s as a ;"

, dst_table, asdb, src_table)

; ierror =

execdml

(sql);if

(ierror <0)

return ierror;

}unsigned

int cppsqlite3db::

op_end

(const

char

*asdb)

return ierror;

}

sqlite在沒有顯式使用事務的時候會為每條 insert 都使用事務操作,而

sqlite資料庫是以檔案的形式存在磁碟中,就相當於每次訪問時都要開啟一次檔案,

如果對資料進行大量的操作,時間都耗費在i/o操作上,所以很慢。

解決方法:

顯式使用事務的形式提交, 因為我們開始事務後,進行的大量操作的語句都儲存在記憶體中,

當提交時才全部寫入資料庫,此時,資料庫檔案也就只用開啟一次。

錯誤處理方式:

//錯誤處理方式: 字串拼接, 當 %s 本身包含 ' 或是 " 或是 一些注入攻擊字串時, 會出錯.

cppsqlite3db bsdb;

bsdb.

open

(file)

;sprintf_s

(dstsql,

sizeof

(dstsql)

,"insert into task_total (taskid,gdsid,taskname,taskbrief,taskdetail,begintime,endtime) values (%llu,%u,'%s','%s','%s','%s','%s');"

,(uint64)row[0]

,(dword)row[1]

,(const

char

*)row[2]

,(const

char

*)row[3]

,(const

char

*)row[4]

,(const

char

*)row[5]

,(const

char

*)row[6]

;bsdb.

execdml

(dstsql)

;

正確處理方式:

//正確處理方式:借助 sqlite 的預編譯 compilestatement 方法

char dstsql[

1024]=

;sprintf_s

(dstsql,

sizeof

(dstsql)

,"insert into *** (col1,col2,col3....) values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);");

cppsqlite3statement stmt = bsdb.

compilestatement

(dstsql)

;char srcsql[

1024]=

;sprintf_s

(srcsql,

sizeof

(srcsql)

,"select **** from **** where ****;");

mysqlpp::query query = sqlconn-

>m_conn-

>

query

(srcsql)

;mysqlpp::usequeryresult res = query.

use();

for(

;res;

)

參考

mysqlpp 封裝了c++對mysql操作

cppsqlite3 封裝了c++對sqlite操作

cppsqlite3statement引數繫結

sqlite 基礎教程 [事務]

sqlite 基礎教程 [附加]

sqlite 基礎教程 [分離]

Python之單引號 雙引號 三單引號 三雙引號

單引號和雙引號區別。三單引號和三雙引號也沒什麼區別。一 兩單引號之間不可以出現單引號,如果出現需要使用轉義字元 但可以出現雙引號 兩雙引號之間不可以出現雙引號,如果出現需要使用轉義字元 但可以出現單引號 兩三單雙引號沒什麼區別,三單引號 三雙引號 兩三單雙引號之間可以單雙引號都可以使用,但不可以出現...

Linux Shell 中的反引號,單引號,雙引號

反引號位 位於鍵盤的tab鍵的上方 1鍵的左方。注意與單引號 位於enter鍵的左方的區別。在linux中起著命令替換的作用。命令替換是指shell能夠將乙個命令的標準輸出插在乙個命令列中任何位置。如下,shell會執行反引號中的date命令,把結果插入到echo命令顯示的內容中。root loca...

Linux Shell 中的反引號,單引號,雙引號

反引號位 位於鍵盤的tab鍵的上方 1鍵的左方。注意與單引號 位於enter鍵的左方的區別。在linux中起著命令替換的作用。命令替換是指shell能夠將乙個命令的標準輸出插在乙個命令列中任何位置。如下,shell會執行反引號中的date命令,把結果插入到echo命令顯示的內容中。root loca...