???一、數據庫安全與防注入實戰??
1. ??SQL 注入原理與危害??
??攻擊本質??:利用輸入漏洞篡改 SQL 語義,例如:
SELECT * FROM users WHERE username = 'admin' OR '1'='1' -- AND password = 'xxx'
OR '1'='1'
導致條件永真,繞過密碼驗證。??危害??:數據泄露(用戶隱私)、越權操作(刪庫)、服務癱瘓。
2. ??防御方案??
??預編譯(PreparedStatement)??:強制分離指令與參數
String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, inputUser); // 參數視為值而非代碼 ps.setString(2, inputPass);
??輸入校驗??:正則過濾特殊字符(如
'
、--
)if (!inputUser.matches("[a-zA-Z0-9_]+")) { throw new InvalidInputException("用戶名含非法字符"); }
??最小權限原則??:數據庫賬號僅授權必要操作(禁用
DROP
、DELETE
)。
3. ??存儲過程與ORM框架??
??存儲過程??:封裝 SQL 邏輯,減少動態拼接(但需防內部注入)
??ORM 框架(如 MyBatis)??:
<select id="getUser" resultType="User">SELECT * FROM users WHERE username = #{user} <!-- #{} 自動預編譯 --> </select>
???二、MySQL 深度優化策略??
1. ??索引優化與慢查詢分析??
??索引類型?? | ??適用場景?? | ??優化效果?? |
---|---|---|
??B+樹索引?? | 等值查詢( | 減少全表掃描,速度提升 10-100 倍 |
??哈希索引?? | 精確匹配(無范圍查詢) | O(1) 查詢,但不支持排序 |
??慢查詢日志??:
-- 啟用慢查詢日志 SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 2; -- 閾值2秒
分析工具:
mysqldumpslow
、Percona Toolkit。
2. ??事務隔離級別選擇??
??級別?? | ??臟讀?? | ??不可重復讀?? | ??幻讀?? | ??適用場景?? |
---|---|---|---|---|
??READ UNCOMMITTED?? | ? | ? | ? | 極少使用 |
??READ COMMITTED?? | ? | ? | ? | Oracle 默認 |
??REPEATABLE READ?? | ? | ? | ? | ??MySQL 默認?? |
??SERIALIZABLE?? | ? | ? | ? | 強一致性(金融系統) |
??代碼設置??:
// JDBC 設置事務隔離級別
conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
???三、數據庫連接池調優??
1. ??核心參數配置(以 Druid 為例)??
??參數?? | ??推薦值?? | ??作用?? |
---|---|---|
| CPU核心數 | 啟動時初始化連接數 |
| 50 | 最大連接數(防數據庫過載) |
| 5 | 最小空閑連接(應對突發流量) |
| 3000 | 獲取連接超時時間(ms) |
|
| 心跳檢測 SQL |
??監控集成??:
<!-- 啟用 Druid 監控 -->
<servlet><servlet-name>DruidStatView</servlet-name><servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>DruidStatView</servlet-name><url-pattern>/druid/*</url-pattern>
</servlet-mapping>
訪問 http://localhost:8080/druid
查看 SQL 執行效率、慢查詢統計。
???四、綜合實戰:用戶管理系統安全優化??
1. ??架構分層設計??
graph TBA[View] --> B[Controller]B --> C[Service]C --> D[DAO]D --> E[MySQL]F[Filter] -->|全局安全控制| B
??Filter 層??:統一防 XSS 攻擊(過濾請求參數)。
??Service 層??:事務管理 + 密碼加密(BCrypt)。
2. ??關鍵代碼實現??
??密碼加密存儲??:
public String encryptPassword(String rawPassword) {return BCrypt.hashpw(rawPassword, BCrypt.gensalt()); }// 驗證密碼 public boolean checkPassword(String rawPassword, String hashedPassword) {return BCrypt.checkpw(rawPassword, hashedPassword); }
??防 XSS 過濾器??:
@WebFilter("/*") public class XssFilter implements Filter {public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {HttpServletRequest request = (HttpServletRequest) req;XssRequestWrapper wrappedRequest = new XssRequestWrapper(request); // 包裝請求,過濾參數chain.doFilter(wrappedRequest, res);} }
???五、高并發場景解決方案??
1. ??讀寫分離(MySQL Replication)??
??角色?? | ??作用?? | ??配置示例?? |
---|---|---|
??Master?? | 寫操作(INSERT/UPDATE) |
|
??Slave?? | 讀操作(SELECT) |
|
??代碼路由??:
public class DynamicDataSource extends AbstractRoutingDataSource {@Overrideprotected Object determineCurrentLookupKey() {return TransactionSynchronizationManager.isCurrentTransactionReadOnly() ? "slave" : "master";}
}
2. ??緩存優化(Redis)??
??緩存穿透??:布隆過濾器攔截非法查詢。
??緩存雪崩??:隨機過期時間 + 熔斷降級。
// 查詢優化:先查緩存,未命中再查庫
public User getUserById(int id) {String key = "user:" + id;User user = redisTemplate.opsForValue().get(key);if (user == null) {user = userDao.findById(id); // 數據庫查詢redisTemplate.opsForValue().set(key, user, 30, TimeUnit.MINUTES);}return user;
}
???六、總結與知識圖譜??
??模塊?? | ??核心技術點?? | ??企業級實踐?? |
---|---|---|
??數據庫安全?? | 預編譯 + 輸入校驗 + 權限控制 | 防御 SQL 注入/XSS 攻擊 |
??MySQL 優化?? | B+樹索引 + 慢查詢分析 + 事務隔離 | 提升查詢效率至毫秒級 |
??連接池調優?? | 參數配置 + 實時監控 | 支撐 5000+ TPS 并發 |
??高并發架構?? | 讀寫分離 + Redis 緩存 | 應對百萬級用戶請求 |
??學習路線圖??:
graph LRA[基礎] --> B[Servlet/JSP]B --> C[JDBC/連接池]C --> D[會話管理]D --> E[安全防護]E --> F[高并發架構]
??“安全是系統的生命線,性能是用戶體驗的基石”??
??動手實踐??:
注入防御測試:嘗試攻擊自己的系統(如輸入
' OR 1=1 --
),驗證防護有效性。慢 SQL 優化:通過
EXPLAIN
分析查詢計劃,添加復合索引。壓力測試:用 JMeter 模擬 1000 并發用戶,優化連接池參數。
??擴展挑戰??:
整合 ??Spring Security?? 實現 RBAC 動態權限控制。
使用 ??ShardingSphere?? 實現分庫分表。