元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
注入攻击与防御
SQL注入原理与利用
SQL注入防御策略
NoSQL注入技术分析
命令注入漏洞实战
ORM框架注入问题
注入攻击自动化检测
▶
认证与会话安全
会话固定与会话劫持
密码存储与加密策略
多因素认证机制
OAuth2.0安全实践
JWT安全攻防
认证逻辑漏洞挖掘
▶
XSS攻击与防御
XSS攻击原理与分类
存储型XSS实战案例
DOM型XSS高级利用
XSS过滤器绕过技术
CSP内容安全策略
前端框架XSS防护
▶
CSRF与点击劫持
CSRF攻击原理演示
CSRF Token防御实践
点击劫持技术剖析
SameSite Cookie策略
框架内置防护机制
跨域资源安全策略
▶
文件安全攻防
文件上传漏洞利用
安全文件类型验证
路径遍历漏洞实战
文件包含漏洞防御
Office文档攻击解析
云存储安全配置
▶
其他Web攻击技术
SSRF漏洞利用与防御
XXE漏洞攻防实战
反序列化漏洞原理
业务逻辑漏洞挖掘
HTTP请求走私攻击
Web缓存投毒攻击
发布时间:
2025-03-23 12:49
↑
☰
# SQL注入防御策略 ## 防御原则 防御SQL注入攻击需要遵循以下基本原则: 1. **输入验证与过滤** - 验证数据类型和长度 - 过滤特殊字符 - 使用白名单策略 2. **参数化查询** - 使用预编译语句 - 避免动态SQL - 分离数据和代码 3. **最小权限原则** - 限制数据库账户权限 - 使用只读账户 - 分离应用权限 ## 输入验证 ### 1. 数据类型验证 ```java // 验证整数输入 public boolean isValidId(String input) { try { int id = Integer.parseInt(input); return id > 0; } catch (NumberFormatException e) { return false; } } // 验证日期格式 public boolean isValidDate(String input) { try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); sdf.setLenient(false); sdf.parse(input); return true; } catch (ParseException e) { return false; } } ``` ### 2. 特殊字符过滤 ```java // 过滤SQL关键字和特殊字符 public String sanitizeInput(String input) { if (input == null) { return null; } // 移除SQL关键字 String[] sqlKeywords = {"SELECT", "INSERT", "UPDATE", "DELETE", "DROP", "UNION", "--"}; String sanitized = input.toUpperCase(); for (String keyword : sqlKeywords) { sanitized = sanitized.replace(keyword, ""); } // 过滤特殊字符 return sanitized.replaceAll("[^a-zA-Z0-9]", ""); } ``` ### 3. 正则表达式验证 ```java // 验证邮箱格式 public boolean isValidEmail(String email) { String regex = "^[A-Za-z0-9+_.-]+@(.+)$"; Pattern pattern = Pattern.compile(regex); return pattern.matcher(email).matches(); } // 验证用户名格式 public boolean isValidUsername(String username) { String regex = "^[a-zA-Z0-9_]{3,20}$"; return username.matches(regex); } ``` ## 参数化查询 ### 1. Java PreparedStatement ```java // 不安全的查询 String query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'"; // 安全的参数化查询 String query = "SELECT * FROM users WHERE username = ? AND password = ?"; PreparedStatement stmt = connection.prepareStatement(query); stmt.setString(1, username); stmt.setString(2, password); ResultSet rs = stmt.executeQuery(); ``` ### 2. PHP PDO ```php // 不安全的查询 $query = "SELECT * FROM users WHERE id = " . $_GET['id']; // 安全的参数化查询 $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$_GET['id']]); ``` ### 3. Python SQLAlchemy ```python # 不安全的查询 query = f"SELECT * FROM users WHERE username = '{username}'" # 安全的ORM查询 user = session.query(User).filter(User.username == username).first() ``` ## 数据库权限控制 ### 1. 创建受限用户 ```sql -- 创建只读用户 CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'password'; GRANT SELECT ON database.* TO 'readonly_user'@'localhost'; -- 创建应用专用用户 CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'password'; GRANT SELECT, INSERT, UPDATE ON database.* TO 'app_user'@'localhost'; ``` ### 2. 表级权限 ```sql -- 限制特定表的访问权限 GRANT SELECT ON database.products TO 'app_user'@'localhost'; GRANT SELECT, INSERT, UPDATE ON database.orders TO 'app_user'@'localhost'; ``` ### 3. 列级权限 ```sql -- 限制敏感列的访问 GRANT SELECT (id, name, email) ON database.users TO 'app_user'@'localhost'; ``` ## 错误处理 ### 1. 隐藏错误信息 ```java // 不安全的错误处理 try { // 数据库操作 } catch (SQLException e) { response.getWriter().println("Database error: " + e.getMessage()); } // 安全的错误处理 try { // 数据库操作 } catch (SQLException e) { logger.error("Database error", e); response.getWriter().println("An error occurred"); } ``` ### 2. 日志记录 ```java // 记录SQL注入尝试 public void logSuspiciousActivity(String input, String ipAddress) { logger.warn("Possible SQL injection attempt from {}: {}", ipAddress, input); // 可以添加告警机制 } ``` ## WAF配置 ### 1. ModSecurity规则 ```apache # 检测SQL注入 SecRule REQUEST_COOKIES|REQUEST_COOKIES_NAMES|REQUEST_FILENAME|REQUEST_HEADERS|REQUEST_HEADERS_NAMES|REQUEST_METHOD|REQUEST_PROTOCOL|REQUEST_URI|REQUEST_URI_RAW|ARGS|ARGS_NAMES|ARGS_POST|ARGS_POST_NAMES "(?i:([\\s'\"`\\xc0\\xa0]|%20|%00|%2f|%5c)on[a-z]+[\\s'\"`\\xc0\\xa0]*(.*)[\\s'\"`\\xc0\\xa0]*=)" \ "phase:2,rev:'2',ver:'OWASP_CRS/3.0.0',maturity:'9',accuracy:'8',id:'941160',t:none,t:urlDecodeUni,block,msg:'NoSQL Injection Attack',logdata:'Matched Data: %{TX.0} found within %{MATCHED_VAR_NAME}: %{MATCHED_VAR}',severity:'2',tag:'OWASP_CRS/WEB_ATTACK/NOSQL_INJECTION'" ``` ### 2. Nginx配置 ```nginx # 限制请求大小 client_max_body_size 10M; # 设置超时时间 client_body_timeout 10; client_header_timeout 10; # 启用ModSecurity modsecurity on; modsecurity_rules_file /etc/nginx/modsecurity/main.conf; ``` ## ORM最佳实践 ### 1. 使用查询构建器 ```javascript // Sequelize ORM示例 const user = await User.findOne({ where: { username: username, status: 'active' }, attributes: ['id', 'username', 'email'] }); ``` ### 2. 数据验证 ```javascript // Mongoose Schema验证 const UserSchema = new Schema({ username: { type: String, required: true, match: /^[a-zA-Z0-9_]{3,20}$/ }, email: { type: String, required: true, validate: { validator: function(v) { return /^[A-Za-z0-9+_.-]+@(.+)$/.test(v); } } } }); ``` ## 安全检查清单 1. **代码审查** - 检查所有SQL查询 - 验证参数化查询使用 - 审查错误处理逻辑 2. **配置检查** - 数据库权限设置 - WAF规则更新 - 错误显示设置 3. **定期测试** - 自动化安全扫描 - 渗透测试 - 代码扫描工具 ## 应急响应 1. **检测SQL注入** - 监控异常查询 - 记录可疑活动 - 设置告警阈值 2. **响应措施** - 阻断攻击源IP - 修补漏洞 - 审计受影响数据 3. **预防措施** - 更新安全策略 - 加强访问控制 - 培训开发人员 ## 总结 SQL注入防御需要多层次的安全措施,包括: 1. 严格的输入验证和过滤 2. 使用参数化查询或ORM 3. 实施最小权限原则 4. proper错误处理 5. 部署WAF防护 6. 定期安全审计和测试 通过综合运用这些防御策略,可以有效降低SQL注入风险。同时,保持安全意识的更新和技术的跟进也是非常重要的。要记住,安全是一个持续的过程,需要不断改进和优化。