/**
* 过滤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;
}
分享到:
相关推荐
开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0,使用java语言开发。 二、功能介绍 如博客中介绍 三、注意事项 1、管理员账号:admin 密码:admin 数据库配置文件applicationContext.xml 2、开发环境为...
数据库课程设计,毕业设计,数据库语句
数据库课程设计,毕业设计,数据库语句
java 酒店推荐推荐系统是一套完善的完整信息系统,结合java web开发和bootstrap UI框架完成本系统 采用协同过滤算法进行推荐 ,对理解JSP java编程开发语言有帮助,系统具有完整 的源代码和数据库,系统主要采用B/...
java 景点推荐系统是一套完善的完整信息系统,结合java web开发和bootstrap UI框架完成本系统 采用协同过滤算法进行推荐 ,对理解JSP java编程开发语言有帮助,系统具有完整的源 代码和数据库,系统主要采用B/S...
数据库课程设计,毕业设计,数据库语句
基于协同过滤算法商品推荐系统论文-java-文档-基于协同过滤算法商品推荐系统文档 论文: !!!本文档只是论文参考文档! 需要项目源码、数据库sql、开发文档、毕设咨询等,请私信联系~ ① 系统环境:Windows/Mac ②...
主要介绍了java使用list实现数据库的like功能,需要的朋友可以参考下
SOHU-DBProxy 是由 搜狐 数据库团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的 MySQL-Proxy 0.8.3版本的基础上, 修改了大量bug,添加了很多功能特性。现在已经在sohu的多个业务线上使用...
SQLDebug是八九软件开发的一个免费的智能查询分析器,它支持Access、MSSQL、MYSQL和ORACLE数据库,它的特性有: SQL语法快速自动完成 能根据数据库类型自动补全数据库保留字、表名、字段名、函数等。 强大的脚本...
该系统主要用于办公室文档管理、人员管理、日程安排等功能,通过JAVA语言开发客户端软件,使用MySQL数据库进行数据存储,实现了文档管理、人员信息管理、日程安排、报表查询等功能。 文档管理模块实现了对办公文档的增...
将SQL数据库转换为jHipster的JDL格式的工具(由于要使用jHipster生成现有数据库并构建angular-java web而创建) 兼容性 此实现适用于mysql 5.7+和mysql 8+。 只需要很少的更改就可以与oracle db,POSTGRES等一起...
基于协同过滤算法的东北特产销售系统的实现论文-基于协同过滤算法的东北特产销售系统的实现-java-文档论文: !!!本文档只是论文参考文档! 需要项目源码、数据库sql、开发文档、毕设咨询等,请私信联系~ ① 系统...
用途:帮助读者了解MySQL中的JOIN操作,掌握LEFT JOIN、ON条件过滤和笛卡尔积的使用方法,从而在实际开发中灵活运用JOIN操作实现表关联查询。本文还提供了扩展内容,如排名等应用场景,帮助读者进一步理解JOIN操作的...
百度云盘分享 ... Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText();...
进入mysql数据库控制台, 如mysql -u root -p mysql>use 数据库 然后使用source命令,后面参数为脚本文件(如这里用到的.sql) mysql>source wcnc_db.sql B:使用mysqldump命令 mysqldump -u username -p dbname ...
Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 String serverAddr=jtfServer.getText(); //得到服务器地址 ...
2,能够安装和卸载MySQL数据库 3,能够使用SQL语句操作数据库 4,能够使用SQL语句操作表结构 5,能够使用SQL语句进行数据的添加修改和删除的操作 6,能够使用SQL语句查询表结构中的数据 7,能够使用SQL语句进行查询...
针对SQL注入隐蔽性极强的特点,本书重点讲解了SQL注入的排查方法和可以借助的工具,总结了常见的利用SQL漏洞的方法。另外,本书还专门从代码层和系统层的角度介绍了避免SQL注入的各种策略和需要考虑的问题。 本书...
针对SQL注入隐蔽性极强的特点,本书重点讲解了SQL注入的排查方法和可以借助的工具,总结了常见的利用SQL漏洞的方法。另外,本书还专门从代码层和系统层的角度介绍了避免SQL注入的各种策略和需要考虑的问题。 本书...