java 判断sql是否存在注入工具类
时间: 2025-06-05 19:28:15 浏览: 13
### Java 中 SQL 注入检测工具类的实现方式
为了防止 SQL 注入攻击,Java 开发者可以通过构建一个专门的工具类来过滤潜在危险的输入。这种工具类通常会结合正则表达式或其他字符串操作技术,识别并移除可能引发 SQL 注入的关键字或特殊字符。
以下是基于现有引用内容以及常见实践的一种实现方案:
#### 使用 `StringEscapeUtils` 处理 SQL 输入
Apache Commons Lang 提供了一个名为 `StringEscapeUtils` 的实用工具类,能够有效转义 SQL 特殊字符。通过调用其静态方法 `escapeSql()` 可以确保传入数据库的参数不会包含恶意代码[^2]。
```java
import org.apache.commons.lang3.StringEscapeUtils;
public class SqlInjectionPrevention {
public static String escapeInput(String input) {
if (input == null) {
return "";
}
return StringEscapeUtils.escapeSql(input);
}
public static void main(String[] args) {
System.out.println(escapeInput("1' OR '1'='1; DROP TABLE test"));
}
}
```
上述代码展示了如何利用第三方库 Apache Commons 来保护应用程序免受简单的 SQL 注入威胁。
#### 自定义关键字过滤器
如果希望进一步增强安全性,则可以创建自定义的方法来扫描用户提交的数据流,并剔除任何可疑模式。下面是一个基本示例,其中列举了一些常见的 SQL 关键词作为黑名单项[^4]:
```java
import java.util.Arrays;
import java.util.List;
public class CustomSqlFilter {
private static final List<String> BLACKLIST_KEYWORDS = Arrays.asList(
"DROP", "DELETE", "INSERT INTO", "UPDATE", "--", ";"
);
/**
* Filters out potentially harmful keywords from the given string.
*
* @param rawInput The unfiltered user input.
* @return A sanitized version of the original text.
*/
public static String cleanSqlKeyWords(String rawInput) {
if (rawInput == null || rawInput.isEmpty()) {
return "";
}
String result = rawInput.toUpperCase();
for (String keyword : BLACKLIST_KEYWORDS) {
result = result.replace(keyword, "");
}
return result.trim(); // Remove leading/trailing whitespace after replacements.
}
public static void main(String[] args) {
String userInput = "SELECT username FROM users WHERE id=1 UNION ALL SELECT password";
System.out.println(cleanSqlKeyWords(userInput));
}
}
```
这种方法虽然简单易懂,但在实际应用中可能存在漏网之鱼或者误报情况,因此建议仅将其视为辅助措施而非唯一防线。
#### 结合 PreparedStatement 技术
除了单独依赖于外部验证机制外,强烈推荐始终优先采用预编译语句 (`PreparedStatement`) 执行动态查询任务。这种方式从根本上杜绝了拼接原始字符串所带来的风险,因为所有的变量都会被自动处理成合适的格式再传递给底层引擎执行[^1]。
```java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class SafeQueryExample {
public static void safeRetrieveData(Connection conn, int userId) throws Exception {
try (PreparedStatement pstmt = conn.prepareStatement("SELECT name, email FROM users WHERE id=?")) {
pstmt.setInt(1, userId);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
System.out.printf("%s (%s)%n", rs.getString("name"), rs.getString("email"));
}
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
public static Connection getConnection() throws Exception {
Class.forName("com.mysql.cj.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql://localhost/testdb?useSSL=false", "root", "password");
}
public static void main(String[] args) throws Exception {
try (Connection connection = getConnection()) {
safeRetrieveData(connection, 789); // Replace with actual ID value provided by end-user.
}
}
}
```
以上片段说明了即使面对复杂场景下也能保持良好表现的最佳做法之一——即充分利用 JDBC API 内置功能完成必要的防护工作。
---
###
阅读全文
相关推荐


















