| | |
| | | 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; |
| | | } |