Server/王琨元/document/单例模式封装.txt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Server/王琨元/document/备份导出.txt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Server/王琨元/document/数据库模块需求分析.docx | 补丁 | 查看 | 原始文档 | blame | 历史 | |
Server/王琨元/document/数据库连接池类.txt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Server/王琨元/document/防注入.txt | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Server/ÍõçûÔª/document/µ¥Àýģʽ·â×°.txt
@@ -1,62 +1,51 @@ #include <iostream> #include <memory> #include <mutex> #include <fstream> #include <string> #include <ctime> using namespace std; class A { #include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/statement.h> #include <cppconn/resultset.h> class DatabaseOperator { private: ofstream logFile; A() { logFile.open("123.txt", ios::app); // ç§ææé 彿° DatabaseOperator() { try { driver = sql::mysql::get_mysql_driver_instance(); connection = driver->connect("tcp://127.0.0.1:3306", "username", "password"); connection->setSchema("your_database"); } catch (sql::SQLException &e) { std::cerr << "æ°æ®åºè¿æ¥é误: " << e.what() << std::endl; } } ~A() { logFile.close(); } A(const A &t){} A& operator=(const A &t){} static A* volatile s_obj; static mutex g_mutex; static DatabaseOperator* instance; static std::mutex mutex; sql::Driver* driver; std::unique_ptr<sql::Connection> connection; public: static A* getInstance() { if (s_obj == nullptr) { lock_guard<mutex> guard(g_mutex); if (s_obj == nullptr) { s_obj = new A; } // è·ååä¾å®ä¾ static DatabaseOperator* getInstance() { std::lock_guard<std::mutex> lock(mutex); if (instance == nullptr) { instance = new DatabaseOperator(); } return s_obj; return instance; } void write(const string& level, const string& description, const string& time) { logFile << "[" << level << "] " << "[" << time << "] " << description << endl; } void release() { if (s_obj) { delete s_obj; s_obj = nullptr; // æ§è¡æ¥è¯¢æä½ï¼ç¤ºä¾ï¼ sql::ResultSet* query(const std::string& sql) { try { std::unique_ptr<sql::Statement> stmt(connection->createStatement()); return stmt->executeQuery(sql); } catch (sql::SQLException &e) { std::cerr << "æ¥è¯¢é误: " << e.what() << std::endl; } return nullptr; } }; A* volatile A::s_obj = nullptr; mutex A::g_mutex; int main() { A* a1 = A::getInstance(); A* a2 = A::getInstance(); if (a1 == a2) { cout << "å便å" << endl; } else { cout << "åä¾å¤±è´¥" << endl; } time_t now = time(nullptr); char buffer[80]; struct tm timeinfo; localtime_s(&timeinfo, &now); strftime(buffer, 80, "%Y - %m - %d %H:%M:%S", &timeinfo); string timeStr(buffer); a1->write("1", "æ¥å¿", timeStr); a1->release(); return 0; } std::mutex DatabaseOperator::mutex; DatabaseOperator* DatabaseOperator::instance = nullptr; Server/ÍõçûÔª/document/±¸·Ýµ¼³ö.txt
New file @@ -0,0 +1,29 @@ #!/bin/bash # æ°æ®åºè¿æ¥åæ° DB_USER="your_username" DB_PASS="your_password" DB_NAME="your_database_name" BACKUP_DIR="/path/to/backup/directory" # è·åå½åæ¥æï¼ç¨äºæä»¶å DATE=$(date +%Y%m%d%H%M%S) # å¤ä»½æä»¶å BACKUP_FILE="${BACKUP_DIR}/backup_${DATE}.sql" # å建å¤ä»½ç®å½ï¼å¦æä¸åå¨ï¼ mkdir -p $BACKUP_DIR # 使ç¨mysqldumpè¿è¡æ°æ®åºå¤ä»½ mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_FILE if [ $? -eq 0 ]; then echo "æ°æ®åºå¤ä»½æåï¼$BACKUP_FILE" else echo "æ°æ®åºå¤ä»½å¤±è´¥" fi # æ·»å 宿¶ä»»å¡ï¼ä½¿ç¨crontab -eæ¥ç¼è¾å®æ¶ä»»å¡ï¼ # ä¾å¦ï¼æ¯å¤©åæ¨2ç¹æ§è¡å¤ä»½ # 0 2 * * * /path/to/this/script.sh Server/ÍõçûÔª/document/Êý¾Ý¿âÄ£¿éÐèÇó·ÖÎö.docxBinary files differ
Server/ÍõçûÔª/document/Êý¾Ý¿âÁ¬½Ó³ØÀà.txt
New file @@ -0,0 +1,91 @@ #include <iostream> #include <list> #include <mutex> #include <condition_variable> #include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/statement.h> #include <cppconn/resultset.h> class SQLConnectionPool { private: SQLConnectionPool(int minConns, int maxConns) : minConnections(minConns), maxConnections(maxConns), currentConnections(0) {} static SQLConnectionPool* instance; static std::mutex mutex; std::condition_variable cv; int minConnections; int maxConnections; int currentConnections; std::list<std::unique_ptr<sql::Connection>> connections; // å建ä¸ä¸ªæ°çæ°æ®åºè¿æ¥ std::unique_ptr<sql::Connection> createConnection() { try { sql::Driver* driver = sql::mysql::get_mysql_driver_instance(); std::unique_ptr<sql::Connection> conn(driver->connect("tcp://127.0.0.1:3306", "username", "password")); conn->setSchema("your_database"); return conn; } catch (sql::SQLException &e) { std::cerr << "åå»ºè¿æ¥é误: " << e.what() << std::endl; return nullptr; } } public: // è·ååä¾å®ä¾ static SQLConnectionPool* getInstance(int minConns, int maxConns) { std::lock_guard<std::mutex> lock(mutex); if (instance == nullptr) { instance = new SQLConnectionPool(minConns, maxConns); instance->initializePool(); } return instance; } // åå§åè¿æ¥æ± void initializePool() { for (int i = 0; i < minConnections; ++i) { std::unique_ptr<sql::Connection> conn = createConnection(); if (conn) { connections.push_back(std::move(conn)); currentConnections++; } } } // è·åæ°æ®åºè¿æ¥ std::unique_ptr<sql::Connection> getConnection() { std::unique_lock<std::mutex> lock(mutex); while (connections.empty() && currentConnections >= maxConnections) { cv.wait(lock); } std::unique_ptr<sql::Connection> conn; if (!connections.empty()) { conn = std::move(connections.front()); connections.pop_front(); } else if (currentConnections < maxConnections) { conn = createConnection(); if (conn) { currentConnections++; } } return conn; } // å½è¿æ°æ®åºè¿æ¥ void releaseConnection(std::unique_ptr<sql::Connection>& conn) { std::lock_guard<std::mutex> lock(mutex); if (currentConnections > minConnections) { currentConnections--; } else { connections.push_back(std::move(conn)); } cv.notify_one(); } }; std::mutex SQLConnectionPool::mutex; SQLConnectionPool* SQLConnectionPool::instance = nullptr; Server/ÍõçûÔª/document/·À×¢Èë.txt
@@ -1,29 +1,67 @@ https://blog.csdn.net/qq_28245087/article/details/131453274 1 .使ç¨åæ°åæ¥è¯¢ 使ç¨åæ°åæ¥è¯¢å¯ä»¥é²æ¢SQLæ³¨å ¥æ»å»ï¼å¹¶æé«ä»£ç çå¯è¯»æ§åå¯ç»´æ¤æ§ãå¨Javaä¸ï¼å¯ä»¥ä½¿ç¨PreparedStatementæ¥å®ç°åæ°åæ¥è¯¢ã 2. è¾å ¥éªè¯åè¿æ»¤ è¾å ¥éªè¯åè¿æ»¤æ¯ä¸ç§ç¨äºç¡®ä¿ç¨æ·è¾å ¥æ°æ®çå®å ¨æ§åæææ§çææ¯ãå®å¯ä»¥é²æ¢æ¶æè¾å ¥åéè¯¯æ°æ®å¯¼è´çå®å ¨æ¼æ´ååºç¨ç¨åºé误ã 3. 使ç¨åå¨è¿ç¨ åå¨è¿ç¨æ¯ä¸ç»é¢å®ä¹çSQLè¯å¥éåï¼å¯ä»¥å¨æ°æ®åºä¸è¿è¡é夿§å夿æ§çæä½ãå®ä»¬å¯ä»¥æ¥ååæ°ï¼å¹¶ä¸å¯ä»¥å¨æ°æ®åºä¸è¿è¡éå¤ä½¿ç¨ã 4.æå°æéåå æå°æéå忝ä¸ç§å®å ¨æ§ååï¼æçæ¯ä¸ºäºä¿æ¤æææ°æ®åç³»ç»èµæºï¼ç¨æ·åºè¯¥è¢«æäºæå°å¿ éçæéãè¿æå³çç¨æ·åªè½è®¿é®åæ§è¡ä»ä»¬å·¥ä½æéçæ°æ®åºå¯¹è±¡åæä½ï¼è䏿¯æ¥æå¯¹æ´ä¸ªæ°æ®åºçå®å ¨è®¿é®æéã ä½¿ç¨æå°æéååå¯ä»¥åå°æ½å¨çå®å ¨é£é©åæ°æ®æ³é²çå¯è½æ§ãéè¿éå¶ç¨æ·çæéï¼å¯ä»¥é²æ¢ä»ä»¬å¯¹æ°æ®åºä¸çæææ°æ®è¿è¡æªç»ææç访é®ãä¿®æ¹æå é¤ã 5. 使ç¨ORMæ¡æ¶ ORMï¼å¯¹è±¡å ³ç³»æ å°ï¼æ¡æ¶æ¯ä¸ç§å°å¯¹è±¡æ¨¡ååå ³ç³»æ°æ®åºä¹é´è¿è¡æ å°çææ¯ãå®å 许å¼å人å使ç¨é¢åå¯¹è±¡çæ¹å¼æä½æ°æ®åºï¼èä¸éè¦ç¼åç¹ççSQLè¯å¥ãORMæ¡æ¶å°æ°æ®åºè¡¨æ å°ä¸ºå¯¹è±¡ï¼å°è¡¨çè¡æ å°ä¸ºå¯¹è±¡ç屿§ï¼å°è¡¨ä¹é´çå ³ç³»æ å°ä¸ºå¯¹è±¡ä¹é´çå ³èã ORMæ¡æ¶çä¼ç¹å æ¬æé«å¼åæçãåå°ä»£ç éãç®åæ°æ®åºæä½ãæä¾å¯¹è±¡çº§å«çæ¥è¯¢åæä¹ åçã 6. 使ç¨åå¤è¯å¥ åå¤è¯å¥ï¼Prepared Statementï¼æ¯ä¸ç§é¢ç¼è¯çSQLè¯å¥ï¼å®å 许å¼å人åå°åæ°åæ¥è¯¢åéå°æ°æ®åºï¼å¹¶å¨æ§è¡æ¶æä¾åæ°å¼ãåå¤è¯å¥å¯ä»¥æé«æ°æ®åºæä½çæ§è½åå®å ¨æ§ï¼åæ¶è¿è½é²æ¢SQLæ³¨å ¥æ»å»ã 7.使ç¨å®å ¨çæ°æ®åºè¿æ¥ 使ç¨å®å ¨çæ°æ®åºè¿æ¥æ¯é常éè¦çï¼å¯ä»¥ä¿æ¤æ°æ®åºå åæ¶ææ»å»åæ°æ®æ³é²ã 使ç¨SSL/TLSå å¯ï¼éè¿ä½¿ç¨SSL/TLSå å¯ï¼å¯ä»¥ç¡®ä¿æ°æ®åºè¿æ¥å¨ä¼ è¾è¿ç¨ä¸çæ°æ®å®å ¨ã 8.é¿å å¨ææ¼æ¥SQLè¯å¥ é¿å å¨ææ¼æ¥SQLè¯å¥æ¯ä¸ºäºé²æ¢SQLæ³¨å ¥æ»å»åæé«ä»£ç çå¯è¯»æ§åå¯ç»´æ¤æ§ã 9.使ç¨é²ç«å¢åå ¥ä¾µæ£æµç³»ç» 使ç¨é²ç«å¢åå ¥ä¾µæ£æµç³»ç»æ¯ä¸ºäºä¿æ¤è®¡ç®æºç½ç»å åæªç»ææç访é®åæ¶ææ»å»ã 10.å®ææ´æ°åç»´æ¤æ°æ®åºè½¯ä»¶ å®ææ´æ°åç»´æ¤æ°æ®åºè½¯ä»¶æ¯é常éè¦çï¼ä»¥ç¡®ä¿æ°æ®åºçå®å ¨æ§ãæ§è½ååè½çç¨³å®æ§ã以䏿¯ä¸äºè¯´æåè§£éï¼ä»¥å使ç¨Java代ç ç¤ºä¾æ¥å®ç°æ°æ®åºè½¯ä»¶çå®ææ´æ°åç»´æ¤ï¼ #include <iostream> #include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/statement.h> #include <cppconn/prepared_statement.h> #include <cppconn/resultset.h> #include <string> #include <regex> å®ææ´æ°ï¼ å®ææ´æ°æ°æ®åºè½¯ä»¶æ¯ä¸ºäºè·åææ°çå®å ¨è¡¥ä¸ãåè½æ¹è¿åæ§è½ä¼åãæ°æ®åºä¾åºåé常ä¼å叿´æ°çæ¬ï¼ä»¥ä¿®å¤å·²ç¥çæ¼æ´åé®é¢ãæ´æ°æ°æ®åºè½¯ä»¶å¯ä»¥æé«æ°æ®åºçå®å ¨æ§ï¼å¹¶ç¡®ä¿æ°æ®åºä¸ææ°çææ¯åæ åä¿æä¸è´ã ç»´æ¤ä»»å¡ï¼ æ°æ®åºè½¯ä»¶çç»´æ¤ä»»å¡å æ¬å¤ä»½åæ¢å¤ãç´¢å¼ä¼åãç»è®¡ä¿¡æ¯æ´æ°ã空é´ç®¡çãæ¥å¿ç®¡ççãè¿äºä»»å¡æå©äºæé«æ°æ®åºçæ§è½ãå¯ç¨æ§åå¯é æ§ã class DatabaseUtils { public: // è¿æ¥æ°æ®åº static sql::Connection* connect() { try { sql::mysql::MySQL_Driver* driver = sql::mysql::get_mysql_driver_instance(); sql::Connection* con = driver->connect("tcp://127.0.0.1:3306", "mayi", "123456"); con->setSchema("your_database"); return con; } catch (sql::SQLException& e) { std::cerr << "æ°æ®åºè¿æ¥é误: " << e.what() << std::endl; return nullptr; } } // æ£æ¥SQLè¯å¥æ¯å¦å卿½å¨æ³¨å ¥é£é©ï¼ç®åæ£åæ ¡éªï¼ static bool isSafeSQL(const std::string& sql) { // ç®åçæ£å表达å¼ï¼é²æ¢å¸¸è§çæ³¨å ¥å ³é®è¯ std::regex injectionRegex("(drop|delete|update|insert|select\\s+\\*\\s+from)", std::regex_constants::icase); return!std::regex_search(sql, injectionRegex); } // 使ç¨åæ°åæ¥è¯¢æ§è¡SQLè¯å¥ static sql::ResultSet* executeSafeQuery(sql::Connection* con, const std::string& sql, const std::vector<std::string>& params) { try { sql::PreparedStatement* pstmt = con->prepareStatement(sql); for (size_t i = 0; i < params.size(); ++i) { pstmt->setString(i + 1, params[i]); } return pstmt->executeQuery(); } catch (sql::SQLException& e) { std::cerr << "æ¥è¯¢æ§è¡é误: " << e.what() << std::endl; return nullptr; } } }; int main() { sql::Connection* con = DatabaseUtils::connect(); if (con) { std::string sql = "SELECT * FROM your_table WHERE column_name =?"; std::vector<std::string> params = {"test_value"}; if (DatabaseUtils::isSafeSQL(sql)) { sql::ResultSet* res = DatabaseUtils::executeSafeQuery(con, sql, params); if (res) { while (res->next()) { // å¤çç»æ std::cout << res->getString(1) << std::endl; } delete res; } } else { std::cerr << "æ½å¨çSQLæ³¨å ¥é£é©" << std::endl; } delete con; } return 0; }