`

针对MySQL数据库过滤SQL查询参数(JAVA实现)

阅读更多

/**
* 过滤SQL参数,防止特殊字符引发的异常和SQL注入
* 只适用于MySQL数据库
* @author sodarfish
* @since 2008.1.21
* @update 2008.1.24
*/
public class SQLFilter{
   public static final int NUMBER_FOR_QUERY=0;
   public static final int MYSQL_CHAR_FOR_UPDATE=1;
   public static final int MYSQL_CHAR_FOR_NONLIKE_QUERY=2;
   public static final int MYSQL_CHAR_FOR_LIKE_QUERY=3;
   public static final int MYSQL_P_CHAR_FOR_LIKE_QUERY=4;
   /**
   * 针对MySQL使用Statement和PreparedStatement进行插入和查询时的参数
   * 进行合法化。
   * 由于MS SQLServer 默认没有用\做转义符,在处理普通操作时,只需要注意'转为''就可以了.
   * 如果用PreparedStatement,那么这一步也可以免掉.
   * 如果要查询%符号,那么在MSSQLSERVER中必须使用escape 进行转义,如果使用了escape '\'
   * 可以使用该类的MYSQL_P_CHAR_FOR_LIKE_QUERY来指定过滤类型.
   * @param sql
   * @param paramType
   * @return
   */
   public static String filtrateSQL(String sql,int paramType){
       if(sql==null){
           //throw new IllegalArgumentException("参数为空!");
           return null;
       }
       //识别参数是否是数字
       if(paramType==SQLFilter.NUMBER_FOR_QUERY){
           Pattern pattern = Pattern.compile("(0|[1-9])[0-9]*(\\.[0-9]*)?");
           if(pattern.matcher(sql).matches())
               return sql;
           else
               //throw new IllegalArgumentException("非法参数!");
               return null;
       }
       //MySQL处理插入操作.将特殊字符加上转义
       if(paramType==SQLFilter.MYSQL_CHAR_FOR_UPDATE){
           String newKey=sql.replaceAll("\\\\","\\\\\\\\");//处理\插入
           newKey=newKey.replaceAll("'","\\\\'");   //处理'插入防止SQL注入
           newKey=newKey.replaceAll("\"","\\\\\"");
           return newKey;
       }
      
       //MySQL处理非LIKE匹配查询操作.将特殊字符加上转义
       if(paramType==SQLFilter.MYSQL_CHAR_FOR_NONLIKE_QUERY){
           String newKey=sql.replaceAll("\\\\","\\\\\\\\");//处理\插入
           newKey=newKey.replaceAll("'","\\\\'");   //处理'插入防止SQL注入
           newKey=newKey.replaceAll("\"","\\\\\"");
           return newKey;
       }
       /**
       * 对于MySQL 使用Statement对象进行LIKE模糊匹配的特殊处理.
       *
       */
       if(paramType==SQLFilter.MYSQL_CHAR_FOR_LIKE_QUERY){
           //处理查询特殊字符首先处理\,因为它有转义作用,在MySQL LIKE匹配中,
           //会出现两次转义,因此实际查询一个\符号,在SQL语句中的输入应当是\\\\,
           //这里由于加上方法中对正则表达式的转义要求和JAVA本身的转义要求,输入16个\
           //恰好表示SQL中4个\
           //然后处理其他特殊字符,他们在SQL中表示为\% \'等.
           String newKey=sql;
           newKey=newKey.replaceAll("\\\\","\\\\\\\\\\\\\\\\");
           newKey=newKey.replaceAll("'","\\\\'");
           newKey=newKey.replaceAll("_","\\\\_");
           newKey=newKey.replaceAll("%", "\\\\%");
           newKey=newKey.replaceAll("\"","\\\\\"");
          
           return newKey;
       }
       /**
       * 对于MySQL 使用PreparedStatement对象进行LIKE模糊匹配的特殊处理.
       * 对MySQL来说,使用PreparedStatement时,只需要特殊处理LIKE匹配问题.
       *
       * 此方法还适用于MSSQL Server2000中,Like 匹配使用了 escape '\'的语句.
       */
       if(paramType==SQLFilter.MYSQL_P_CHAR_FOR_LIKE_QUERY){
           //由于MySQL中\为默认转义字符
           //处理参数中的特殊字符,\用\\转义成普通的\字符.
          
           String newKey=sql;
           newKey=newKey.replaceAll("\\\\","\\\\\\\\");
           newKey=newKey.replaceAll("'","\\\\'");
           newKey=newKey.replaceAll("_","\\\\_");
           newKey=newKey.replaceAll("%", "\\\\%");
           newKey=newKey.replaceAll("\"","\\\\\"");
          
           return newKey;
       }
       return null;
   }

分享到:
评论

相关推荐

    java实现mysql数据库的表导出到excel文件

    在Java开发中,有时我们需要将MySQL数据库中的数据导出到Excel文件,以便于数据分析、报告生成或备份。这个过程可以通过编程实现,主要涉及到Java数据库连接(JDBC)和处理Excel文件的技术。以下是一个详细的步骤...

    java连接mysql的 gui图形界 面实现增删改查

    在Java编程中,连接MySQL数据库并实现GUI图形界面的增删改查功能是一项常见的任务,尤其在开发桌面应用时。这个任务涉及到多个知识点,包括Java的数据库连接、Swing或JavaFX图形界面库的使用、SQL语言以及多线程处理...

    Myeclipse(struts2实现增删改查)+mysql数据库

    10. **安全性**:尽管这是一个基础示例,但在实际应用中,应考虑安全性问题,如SQL注入、XSS攻击等,可以使用预编译的SQL、参数化查询,以及过滤用户输入等方式来增强安全性。 以上就是“Myeclipse(struts2实现增...

    SERVLET技术实现数据库查询

    在本项目中,"SERVLET技术实现数据库查询",意味着我们将探讨如何利用Servlet来与数据库进行交互,特别是MySQL数据库。SpringMVC是一个基于Spring框架的轻量级Web MVC框架,它简化了在Servlet中处理请求和响应的过程...

    weka连接mysql数据库,完美修改配置(java代码)

    总结起来,连接Weka到MySQL数据库涉及Java编程,包括使用JDBC驱动建立连接,执行SQL查询,将结果转换为Weka可理解的格式。这个过程允许我们在数据分析时直接操作数据库,提高了工作效率,并且能够处理大量实时数据。...

    Java解析excel导入MySQL数据库

    在IT行业中,将Excel文件的数据解析并导入到MySQL...以上就是“Java解析excel导入MySQL数据库”这一主题的主要技术细节。通过理解这些知识点,你可以根据自身需求定制和扩展这个功能,使其更加适应实际的工作场景。

    SpringBoot定时任务实现Oracle和mysql数据同步

    3. **查询数据**:在Oracle数据库中使用`Statement`或`PreparedStatement`执行SQL查询,获取需要同步的数据。 4. **数据转换**:根据业务需求,可能需要对查询结果进行处理,比如数据类型转换、格式化等。 5. **...

    java oracle mysql数据库配置

    根据给定的信息,我们可以归纳出以下关于Java、Oracle与MySQL数据库配置的相关知识点: ### 一、数据库驱动配置 #### 1. **SQL Server 配置** - **JTDs (Java to Data Source)**: 一种开源的 JDBC 驱动程序,用于...

    Linux下的MySQL数据库编程_代码

    在Linux环境下进行MySQL数据库编程是一项重要的技能,尤其对于IT专业人士来说。MySQL是一个广泛使用的开源关系型数据库管理系统(RDBMS),它提供了强大的数据存储和管理功能。Linux作为服务器操作系统,与MySQL的...

    javaservlet连接mysql数据库.pdf

    `这行代码是加载MySQL的JDBC驱动,使得Java程序可以识别并使用MySQL数据库。 - 建立连接:`Connection con1 = DriverManager.getConnection(url, username, password);`这里的URL是数据库的地址,包括协议、主机名...

    java ssh 银行票管理系统eclipse开发mysql数据库MVC模式java编程网页设计协同过滤算法推荐源码

    开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0,使用java语言开发。 二、功能介绍 如博客中介绍 三、注意事项 1、管理员账号:admin 密码:admin 数据库配置文件applicationContext.xml 2、开发环境为...

    MYSQL数据库教程

    MySQL数据库教程是一个面向初学者的综合指南,旨在帮助学习者掌握MySQL的基本概念、命令和实际应用。MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它以其高效、可靠和易于学习的特点,成为了许多企业和...

    java实现与数据库连接验证用户登录实现增删改查的小例子

    为了与数据库建立连接,你需要导入`java.sql.Connection`、`java.sql.DriverManager`、`java.sql.PreparedStatement`等相关的类。 接着,我们需要配置数据库连接参数,包括数据库URL、用户名和密码。这些信息通常...

    用MYSQL数据库的在线考试系统

    这通常使用如PHP、Java或Python等服务器端语言实现,结合MYSQL数据库进行数据操作。 3. 数据库:MYSQL作为关系型数据库,用于存储试题、考生信息、考试成绩等核心数据。其强大的SQL语言能高效处理各种复杂的查询...

    省市区三级联动地址mysql数据库

    这里我们关注的是“省市区三级联动地址mysql数据库”,这个主题涉及到Java后端开发、前端交互以及MySQL数据库管理。首先,我们来了解一下什么是“三级联动”。 三级联动通常指的是在用户界面中,如下拉菜单或选择框...

    mysql-connector-java-5.1.19.jar.zip

    MySQL Connector/J 就是实现了这一 API 的驱动,使得 Java 应用能够与 MySQL 数据库建立连接、执行 SQL 查询、处理结果集等操作。 在描述中提到“logstash 使用 DB”,这暗示了我们将 MySQL Connector/J 驱动用于 ...

    mysql数据库查询

    本文将围绕“MySQL数据库查询”这一主题,深入探讨其背后的原理、技巧以及如何优化查询性能,以期帮助程序员们更高效地利用数据库资源,实现代码改变世界的愿景。 ### MySQL数据库查询基础知识 #### SQL语句构造 ...

    使用java,jdbc连接数据库和Java swing图形化界面完成一个商品管理系统.zip

    包含了使用Java编程语言,结合JDBC(Java Database Connectivity)接口与MySQL数据库,以及利用Java Swing构建图形用户界面(GUI)来实现的一个商品管理系统。这个项目很适合初学者理解和实践Java在实际应用中的开发...

    kettle(ETL工具)mysql 5.7 数据库的驱动包

    类路径是Java运行时系统查找类和其他资源的路径,这样Kettle在启动时就能自动找到并加载MySQL的驱动,从而实现与MySQL数据库的连接。 在Kettle中配置MySQL连接,你需要提供以下信息: 1. **主机名**:MySQL服务器的...

    练习:连接数据库并查询数据

    - 常见的数据库管理系统(DBMS)包括MySQL、Oracle、SQL Server、MongoDB和PostgreSQL等。 2. **数据库连接**: - 连接数据库通常需要数据库驱动、数据库URL、用户名和密码。 - 对于关系型数据库,如MySQL,可以...

Global site tag (gtag.js) - Google Analytics