java 参数过滤,防止异常注入

本文介绍了一个自定义的Servlet过滤器,用于对HTTP请求中的参数进行过滤处理,包括HTML标签转义及黑名单关键字过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.web.filter;


import java.io.IOException;


import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;


import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;


public class ParamFilter implements Filter {


private String[] paramArray=null;

@Override
public void destroy() {


}


@Override
public void doFilter(ServletRequest req, ServletResponse rep,FilterChain fc) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)req;
HttpServletRequestWrapper hrw=new HttpServletRequestWrapper(request){
@Override
public String getParameter(String name) {
String value=super.getParameter(name);
if(StringUtils.isNotBlank(value)){
value=filterValue(value);
}
return value;
}
};
fc.doFilter(hrw, rep);
}


/**
* 获取配置参数
*/
@Override
public void init(FilterConfig fc) throws ServletException {
String value=fc.getInitParameter("sql");
if(StringUtils.isNotBlank(value)){
paramArray=value.split(",");
}
}


/**
* 过滤关键字
* @param value
* @return
*/
private String filterValue(String value){
//html标签转义
value=StringEscapeUtils.escapeHtml4(value);
//自定义的关键字过滤
for(int i=0;paramArray!=null&&paramArray.length>0;i++){
value=value.replaceAll(paramArray[i], "");
}
return value;
}
}
<think>好的,我现在需要帮助用户了解Java后端防止SQL注入的最佳实践。首先,我需要回忆一下SQL注入的原理,即攻击者通过输入恶意SQL代码来操纵数据库查询。接下来,结合用户提供的引用内容,尤其是引用[1]、[2]、[3]、[4],整理出主要的护方法。 用户提供的引用中提到使用PreparedStatement、输入过滤、ORM框架、最小权限原则等方法。这些都是常见的御手段。我需要将这些方法系统地组织起来,确保结构清晰。 首先,PreparedStatement是基础且有效的方式,因为它使用预编译语句,避免拼接SQL,引用[1]和[2]都强调了这一点。需要详细说明它的工作原理和示例代码。 其次,输入验证和过滤也很重要,引用[3]和[4]提到对用户输入进行检查,过滤特殊字符。这里可以分白名单和黑名单两种策略,但推荐白名单,因为更安全。 然后,使用ORM框架如Hibernate或MyBatis,它们内部通常已经处理了参数查询,引用[2]中的方案可能涉及这一点,需要进一步解释。 另外,数据库权限设置,如最小权限原则,引用[1]提到数据库层护,避免使用高权限账户,减少潜在损害。 还有,避免动态拼接SQL,引用[1]的例子说明拼接SQL的危险,所以应该提醒开发者不要这样做。 此外,引用[4]中的正则表达式过滤特定标签,虽然主要针对XSS,但思路可以借鉴,比如过滤SQL相关的关键词或特殊符号。 还需要考虑其他措施,比如定期漏洞扫描和日志监控,这些虽然没有直接出现在引用里,但属于最佳实践的一部分,应该补充进去。 最后,确保回答结构清晰,分点说明,每个方法都有原理和实例,比如代码示例。同时,按照用户要求,相关问题需要相关且能引导深入学习,比如询问PreparedStatement的原理或ORM框架如何防止注入。 检查是否有遗漏,比如存储过程或Web应用火墙,但根据引用内容,可能不需要深入这些。保持答案紧扣提供的引用,并适当扩展。确保使用正确的中文术语,避免技术术语错误,比如“参数查询”等。 总结步骤:介绍每种方法,结合引用内容,给出示例代码(如PreparedStatement的Java代码),最后列出相关问题。确保所有LaTeX格式正确,行内公式用$...$,独立公式用$$...$$,但这个问题中可能较少涉及数学公式,但如果有需要,比如解释正则表达式模式,可能需要使用。例如,引用[4]中的正则表达式可以用行内代码块而非LaTeX。需要遵循用户的格式要求,特别是代码块使用三个反引号包裹,并标明语言。 现在组织内容,确保每个部分引用正确的来源,例如PreparedStatement部分引用[1][2],输入过滤引用[3][4],ORM引用[2]可能的方案等。最后的问题需要围绕这些方法展开,帮助用户进一步学习。</think>### Java后端防止SQL注入的最佳实践 #### 1. **使用预编译语句(PreparedStatement)** **原理**:通过将SQL语句与参数分离,避免直接拼接用户输入到SQL中。数据库会预先编译SQL模板,用户输入仅作为参数传递,从根本上阻止恶意代码注入[^1][^2]。 ```java String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; try (PreparedStatement stmt = connection.prepareStatement(sql)) { stmt.setString(1, userInputUsername); stmt.setString(2, userInputPassword); ResultSet rs = stmt.executeQuery(); } ``` #### 2. **输入验证与过滤** - **白名单校验**:限制输入格式(如仅允许字母数字),例如使用正则表达式:`^[a-zA-Z0-9]+$`[^3]。 - **黑名单过滤**:移除敏感字符(如`'`、`"`、`;`)或SQL关键字(如`DROP`、`UNION`),但此方法可靠性较低,需结合其他手段[^4]。 #### 3. **ORM框架替代原生SQL** 使用Hibernate、MyBatis等框架,其内置的参数查询机制可自动处理输入转义。例如MyBatis的`#{}`语法: ```xml <select id="getUser" resultType="User"> SELECT * FROM users WHERE username = #{username} </select> ``` #### 4. **最小权限原则** 为数据库账户分配仅满足业务需求的最小权限,例如禁止普通业务账号执行`DROP TABLE`或`UPDATE`系统表等操作[^1]。 #### 5. **避免动态拼接SQL** 禁止直接拼接用户输入到SQL语句中: ```java // 错误示例:存在注入风险 String sql = "SELECT * FROM users WHERE username = '" + userInput + "'"; ``` #### 6. **其他增强措施** - **Web应用火墙(WAF)**:拦截含有SQL关键字的请求。 - **定期漏洞扫描**:通过工具(如OWASP ZAP)检测潜在注入点。 - **日志监控**:记录异常SQL操作并及时告警。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值