使用SpringAOP拦截关键字,防止sql注入
前言
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息
一、SqlFilter是什么?
sqlFilter主要是用来防止sql注入,在数据做防sql注入之前提前做校验,为系统安全添加保障。
二、使用步骤
1.在web.xml中配置
<filter>
<filter-name>sqlFilter</filter-name>
<filter-class>com.**.**.sqlFilter</filter-class>
</filter>
2.编写过滤方法
public class sqlFilter implements Filter{
private static String strSql="^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$";
private static String sqlKeyWord = "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|"
+ "(\\b(select|and|or|delete|trancate|char|into|substr|ascii|declare|exec|count|into|drop|execute)\\b)";
private static Pattern sqlPattern = Pattern.compile(checksql, Pattern.CASE_INSENSITIVE);
private static Pattern sqlKeyWordPattern = Pattern.compile(sqlKeyWord, Pattern.CASE_INSENSITIVE);
@Override
public void destroy() {
System.out.println("过滤器被销毁!");
// TODO Auto-generated method stub
}
/**
*判断前端请求是否合法
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
/**
* 设置到sysContent里面 aop可以去到session
*/
HttpServletRequest httpRequest = (HttpServletRequest)request;
HttpServletResponse httpResponse = (HttpServletResponse)response;
SysContent.setRequest(httpRequest);
SysContent.setResponse(httpResponse);
if(this.validSQL((HttpServletRequest)request, (HttpServletResponse)response)){
chain.doFilter(request, response);
}else{
throw new IOException("非法请求,请确认输入参数是否合法");
}
}
public boolean validSQL(HttpServletRequest request ,HttpServletResponse response) {
Enumeration e=request.getParameterNames();
String name="";
String[] values=null;
boolean checkResult=true;
while(e!=null&&e.hasMoreElements()){
name= e.nextElement().toString();
//获取请求的参数
values=request.getParameterValues(name);
if(values!=null){
for(int i=0;i<values.length;i++){
//sql关键字与传入的参数做对比
if(sqlPattern.matcher(values[i]).find()){
checkResult=false;
break;
}
//查找到sql语句
if(sqlKeyWordPattern.matcher(values[i]).find()){
checkResult=false;
sendMessageByResponse("validationError:::参数【"+values[i]+"】中含敏感关键词,请确认!!!:::validationError", response, getLogger());
break;
}
}
}
}
return checkResult;
};
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 将信息通过response发送给前台
*
* @param message
* 发送信息
*/
public static void sendMessageByResponse(String message, HttpServletResponse response, EnhancedLogger logger) {
response.reset();
response.setContentType("text/html;charset=" + Constants.ENCODING);
try {
response.getWriter().write(message);
response.getWriter().flush();
response.getWriter().close();
} catch (IOException e) {
logger.error(e);
}
}
该处使用的url网络请求的数据。
总结
以上只是通过一种方式过滤sql注入,还有很多的方法可以防止sql注入,希望以上分享对有需要的人有帮助。