From 88b2854c40c76750372ae83b862acbb5f5b11776 Mon Sep 17 00:00:00 2001 From: wangky <m1561510467@163.com> Date: 星期二, 05 十一月 2024 14:57:24 +0800 Subject: [PATCH] 1 --- Server/王琨元/code/ConnectionPool.cpp | 5 Server/王琨元/code/MysqlConn.h | 5 + Server/王琨元/code/MysqlConn.cpp | 167 ++++++++++++++++++++++++----------------- 表.docx | 0 Server/王琨元/log/日志模板_王琨元_1104.doc | 0 Server/王琨元/log/~$模板_王琨元_1104.doc | 0 Server/王琨元/code/ConnectionPool.h | 4 7 files changed, 107 insertions(+), 74 deletions(-) diff --git "a/Server/\347\216\213\347\220\250\345\205\203/code/ConnectionPool.cpp" "b/Server/\347\216\213\347\220\250\345\205\203/code/ConnectionPool.cpp" index 548d07f..ce7acb2 100644 --- "a/Server/\347\216\213\347\220\250\345\205\203/code/ConnectionPool.cpp" +++ "b/Server/\347\216\213\347\220\250\345\205\203/code/ConnectionPool.cpp" @@ -1,3 +1,4 @@ +#include "stdafx.h" #include "ConnectionPool.h" #include <fstream> @@ -30,7 +31,7 @@ bool ConnectionPool::parseJsonFile() { - std::ifstream ifs("dbconf.json"); + /*std::ifstream ifs("dbconf.json"); Reader rd; Value root; rd.parse(ifs, root); @@ -45,7 +46,7 @@ max_del_time = root["maxDleTime"].asInt(); m_timeout = root["timeout"].asInt(); return true; - } + }*/ return false; } diff --git "a/Server/\347\216\213\347\220\250\345\205\203/code/ConnectionPool.h" "b/Server/\347\216\213\347\220\250\345\205\203/code/ConnectionPool.h" index fe89205..bce6a07 100644 --- "a/Server/\347\216\213\347\220\250\345\205\203/code/ConnectionPool.h" +++ "b/Server/\347\216\213\347\220\250\345\205\203/code/ConnectionPool.h" @@ -3,11 +3,11 @@ #include <queue> #include <mutex> #include <condition_variable> -#include <json/json.h> +//#include <json/json.h> #include "MysqlConn.h" -using namespace Json; +//using namespace Json; class ConnectionPool { diff --git "a/Server/\347\216\213\347\220\250\345\205\203/code/MysqlConn.cpp" "b/Server/\347\216\213\347\220\250\345\205\203/code/MysqlConn.cpp" index cf3a431..5725af8 100644 --- "a/Server/\347\216\213\347\220\250\345\205\203/code/MysqlConn.cpp" +++ "b/Server/\347\216\213\347\220\250\345\205\203/code/MysqlConn.cpp" @@ -1,115 +1,144 @@ +#include "stdafx.h" #include "MysqlConn.h" #include <regex> + + // 初始化连接 MysqlConn::MysqlConn() { - mysql_ = mysql_init( mysql_ ); - // 设置字符集 - if( mysql_ ) mysql_set_character_set(mysql_ , "gbk"); + mysql_ = mysql_init(mysql_); + // 设置字符集 + if (mysql_) mysql_set_character_set(mysql_, "gbk"); } // 连接数据库 -bool MysqlConn::connect( std::string ip, std::string userName, std::string passwd, std::string db, int port ) { - mysql_ = mysql_real_connect(mysql_, ip.c_str(), userName.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0); - if (!mysql_) { - return false; - } - return true; +bool MysqlConn::connect(std::string ip, std::string userName, std::string passwd, std::string db, int port) { + mysql_ = mysql_real_connect(mysql_, ip.c_str(), userName.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0); + if (!mysql_) { + return false; + } + return true; } // 释放资源 MysqlConn::~MysqlConn() { - if (mysql_) { - mysql_close(mysql_); - mysql_ = nullptr; - } - freeRes(); + if (mysql_) { + mysql_close(mysql_); + mysql_ = nullptr; + } + freeRes(); } + // 更新数据 -bool MysqlConn::update( std::string sql ) { - if (!isSqlSafe(sql)) - { - return false; - } - int ret = mysql_query( mysql_ , sql.c_str()); - if( ret != 0 ){ - return false; - } - return true; +bool MysqlConn::update(std::string sql) { + // 参数化查询优化后的安全检查 + MYSQL_STMT* stmt = mysql_stmt_init(mysql_); + if (!stmt) { + return false; + } + if (mysql_stmt_prepare(stmt, sql.c_str(), sql.length())) { + mysql_stmt_close(stmt); + return false; + } + int paramCount = mysql_stmt_param_count(stmt); + if (paramCount > 0) { + // 如果有参数,需要进行参数绑定等操作,这里暂不实现 + mysql_stmt_close(stmt); + return false; + } + if (mysql_stmt_execute(stmt)) { + mysql_stmt_close(stmt); + return false; + } + mysql_stmt_close(stmt); + return true; } // 查询数据库 bool MysqlConn::query(std::string sql) { - freeRes( ); - if (!isSqlSafe(sql)) - { - return false; - } - int ret = mysql_query(mysql_, sql.c_str()); - if (ret != 0) return false; - - // 获取查询结果 - res_ = mysql_store_result(mysql_); - if (!res_) return false; - return true; + freeRes(); + // 参数化查询优化后的安全检查 + MYSQL_STMT* stmt = mysql_stmt_init(mysql_); + if (!stmt) { + return false; + } + if (mysql_stmt_prepare(stmt, sql.c_str(), sql.length())) { + mysql_stmt_close(stmt); + return false; + } + int paramCount = mysql_stmt_param_count(stmt); + if (paramCount > 0) { + // 如果有参数,需要进行参数绑定等操作,这里暂不实现 + mysql_stmt_close(stmt); + return false; + } + if (mysql_stmt_execute(stmt)) { + mysql_stmt_close(stmt); + return false; + } + res_ = mysql_stmt_result_metadata(stmt); + if (!res_) { + mysql_stmt_close(stmt); + return false; + } + mysql_stmt_close(stmt); + return true; } // 得到结果集 bool MysqlConn::getResult() { - if (res_) { - row_ = mysql_fetch_row(res_); - if(row_) return true; - } - return false; + if (res_) { + row_ = mysql_fetch_row(res_); + if (row_) return true; + } + return false; } // 获取结果集的字段 -std::string MysqlConn::getField( int index ) { - int cols = mysql_num_fields(res_); - if ( index >= cols || index < 0 ) return std::string(""); - - char* value = row_[index]; - unsigned long len = mysql_fetch_lengths(res_)[index]; - return std::string(value, len); +std::string MysqlConn::getField(int index) { + int cols = mysql_num_fields(res_); + if (index >= cols || index < 0) return std::string(""); + + char* value = row_[index]; + unsigned long len = mysql_fetch_lengths(res_)[index]; + return std::string(value, len); } // 事务操作 bool MysqlConn::transaction() { - return mysql_autocommit(mysql_ ,false ); + return mysql_autocommit(mysql_, false); } // 提交事务 bool MysqlConn::commit() { - return mysql_commit(mysql_); + return mysql_commit(mysql_); } // 事务回滚 bool MysqlConn::rollback() { - return mysql_rollback(mysql_); + return mysql_rollback(mysql_); } -void MysqlConn::refreshActiveTime() -{ - activeTime_ = std::chrono::steady_clock::now(); +void MysqlConn::refreshActiveTime() { + activeTime_ = std::chrono::steady_clock::now(); } -long long MysqlConn::getActiveTime() -{ - // 纳米 - std::chrono::nanoseconds nased = std::chrono::steady_clock::now() - activeTime_; - // 转换成毫米 - std::chrono::microseconds millsed = std::chrono::duration_cast<std::chrono::microseconds>( nased ); - return millsed.count( ); // 多少毫秒 +long long MysqlConn::getActiveTime() { + // 纳米 + std::chrono::nanoseconds nased = std::chrono::steady_clock::now() - activeTime_; + // 转换成毫米 + std::chrono::microseconds millsed = std::chrono::duration_cast<std::chrono::microseconds>(nased); + return millsed.count(); // 多少毫秒 } + // 安全校验实现,这里简单使用正则表达式判断是否包含危险字符 -bool MysqlConn::isSqlSafe(const std::string& sql) -{ - std::regex dangerousPattern(".*(['\";\\-+=]).*"); - return!std::regex_search(sql, dangerousPattern); +bool MysqlConn::isSqlSafe(const std::string& sql) { + std::regex dangerousPattern(".*(['\";\\-+=]).*"); + return!std::regex_search(sql, dangerousPattern); } void MysqlConn::freeRes() { - if (res_) { - mysql_free_result(res_); - res_ = nullptr; - } + if (res_) { + mysql_free_result(res_); + res_ = nullptr; + } } \ No newline at end of file diff --git "a/Server/\347\216\213\347\220\250\345\205\203/code/MysqlConn.h" "b/Server/\347\216\213\347\220\250\345\205\203/code/MysqlConn.h" index 577bb2c..00c9917 100644 --- "a/Server/\347\216\213\347\220\250\345\205\203/code/MysqlConn.h" +++ "b/Server/\347\216\213\347\220\250\345\205\203/code/MysqlConn.h" @@ -2,10 +2,13 @@ #include <string> #include <WinSock2.h> -#include <mysql.h> +//#include <mysql.h> +#include "MySQL/include/mysql.h" #include <string.h> #include <chrono> +#pragma comment(lib,"./MySQL/lib/libmysql.lib") + class MysqlConn { public: diff --git "a/Server/\347\216\213\347\220\250\345\205\203/log/~$\346\250\241\346\235\277_\347\216\213\347\220\250\345\205\203_1104.doc" "b/Server/\347\216\213\347\220\250\345\205\203/log/~$\346\250\241\346\235\277_\347\216\213\347\220\250\345\205\203_1104.doc" new file mode 100644 index 0000000..8b245e2 --- /dev/null +++ "b/Server/\347\216\213\347\220\250\345\205\203/log/~$\346\250\241\346\235\277_\347\216\213\347\220\250\345\205\203_1104.doc" Binary files differ diff --git "a/Server/\347\216\213\347\220\250\345\205\203/log/\346\227\245\345\277\227\346\250\241\346\235\277_\347\216\213\347\220\250\345\205\203_1104.doc" "b/Server/\347\216\213\347\220\250\345\205\203/log/\346\227\245\345\277\227\346\250\241\346\235\277_\347\216\213\347\220\250\345\205\203_1104.doc" new file mode 100644 index 0000000..9461d22 --- /dev/null +++ "b/Server/\347\216\213\347\220\250\345\205\203/log/\346\227\245\345\277\227\346\250\241\346\235\277_\347\216\213\347\220\250\345\205\203_1104.doc" Binary files differ diff --git "a/\350\241\250.docx" "b/\350\241\250.docx" index 5677713..bb4ce96 100644 --- "a/\350\241\250.docx" +++ "b/\350\241\250.docx" Binary files differ -- Gitblit v1.8.0