前言
浅谈 SQL 注入:
所谓 SQL 注入, 就是通过把 SQL 命令插入到 web 表单提交或输入域名或页面请求的查询字符串, 最终达到欺骗服务器执行恶意的 SQL 命令, 达到一定的非法用途.
解决办法
1, 配置 WEB-INF/web.xml
- <web-app>
- <welcome-file-list>
- <welcome-file>index.html</welcome-file>
- </welcome-file-list>
- <!-- 防 SQL 注入过滤 -->
- <filter>
- <filter-name>SqlInjectFilter</filter-name>
- <filter-class>com.seesun2012.web.core.filter.SqlInjectFilter</filter-class>
- <!-- 过滤前台传入的参数, 可手动添加或删减, 以 "|" 分割 -->
- <init-param>
- <param-name>sqlInjectStrList</param-name>
- <param-value>'|or|and|;|-|--|+|,|like|//|/|*|%|#</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>SqlInjectFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- </web-app>
2, 过滤器 SqlInjectFilter.java 类
- package com.seesun2012.web.core.filter;
- import java.io.IOException;
- import java.util.Enumeration;
- 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;
- /**
- * SQL 注入过滤器
- * @author CSDN:seesun2012
- * @version 0.0.1-SNAPSHOT
- * @Date 2018-01-14
- */
- public class SqlInjectFilter implements Filter{
- public FilterConfig config;
- @Override
- public void destroy() {
- this.config = null;
- }
- @Override
- public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
- HttpServletRequest httprequest = (HttpServletRequest) request;
- // 获得所有请求参数名
- Enumeration<?> params = httprequest.getParameterNames();
- String sql = "";
- while (params.hasMoreElements()) {
- // 得到参数名
- String name = params.nextElement().toString();
- // 得到参数对应值
- String[] value = httprequest.getParameterValues(name);
- for (int i = 0; i <value.length; i++) {
- sql = sql + value[i];
- }
- }
- // 过滤掉的 SQL 关键字, 可以手动添加
- String sqlInjectStrList = config.getInitParameter("sqlInjectStrList");
- if (sqlValidate(sql, sqlInjectStrList)) {
- throw new IOException("请输入有效字符");
- // 重定向或跳转, 略...
- } else {
- chain.doFilter(request, response);
- }
- }
- // 校验 SQL
- protected static boolean sqlValidate(String str, String sqlInjectStrList) {
- // 统一转为小写
- str = str.toLowerCase();
- // 转换为数组
- String[] badStrs = sqlInjectStrList.split("\\|");
- for (int i = 0; i < badStrs.length; i++) {
- // 检索
- if (str.indexOf(badStrs[i])>= 0) {
- return true;
- }
- }
- return false;
- }
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- config = filterConfig;
- }
- }
备注
相关说明文档: SQL 注入(百度知道) https://baike.baidu.com/item/sql注入/150289?fr=aladdin
相关测试案例: SQL 注入实战(仅供测试学习) http://blog.jobbole.com/105586
本文仅供 Java 相关学习交流与 Web 防御, 如果用于非法攻击或非法操作以及商业攻击, 后果自负!
来源: http://www.bubuko.com/infodetail-2654871.html