现有项目有大量的后台查询没有使用预处理,所以前台必须使用过滤器对参数做过滤以防止sql注入。
原有方法,使用字符检索过滤:
private boolean isValid(String p) {
p = p.toUpperCase();
if (p.indexOf("DELETE") >= 0 || p.indexOf("ASCII") >= 0
|| p.indexOf("UPDATE") >= 0 || p.indexOf("SELECT") >= 0
|| p.indexOf("'") >= 0 || p.indexOf("SUBSTR(") >= 0
|| p.indexOf("COUNT(") >= 0 || p.indexOf(" OR ") >= 0
|| p.indexOf(" AND ") >= 0 || p.indexOf("DROP") >= 0
|| p.indexOf("EXECUTE") >= 0 || p.indexOf("EXEC") >= 0
|| p.indexOf("TRUNCATE") >= 0 || p.indexOf("INTO") >= 0
|| p.indexOf("DECLARE") >= 0 || p.indexOf("MASTER") >= 0
) {
logger.error("未能通过过滤器:p=" + p);
return false;
}
return true;
}
缺点,对于 UPDATEOK,BORD 这样的参数也会被过滤掉,对于/**/ 或者 /**ABC*/就很难做出判定了。
使用正则表达式过滤:
//过滤 ‘
//ORACLE 注解 -- /**/
//关键字过滤 update ,delete
static String reg = "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|"
+ "(\\b(select|update|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)";
static Pattern sqlPattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);
/***************************************************************************
* 参数校验
*
* @param str
*/
public static void isValid(String str) {
if (sqlPattern.matcher(str).find()) {
logger.error("未能通过过滤器:p=" + p);
return false;
}
return true;
}
最后要注意的是对参数做匹配之前,先要做下decode处理:
String qurystr = req.getQueryString()==null?"": req.getQueryString();
if (!qurystr.equals("")) {
try {
qurystr = java.net.URLDecoder.decode(qurystr);
} catch (Exception e1) {
qurystr = httpReq.getRequestURI();
}
}
分享到:
相关推荐
Java正则表达式构造SQL语句Java正则表达式构造SQL语句Java正则表达式构造SQL语句
如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么...本文接下来的内容先简要地介绍正则表达式的入门知识,然后以Jakarta-ORO API为例介绍如何使用正则表达式。
Java正则表达式Java正则表达式Java正则表达式Java正则表达式
主要介绍了Java使用正则表达式提取XML节点内容的方法,结合具体实例形式分析了java针对xml格式字符串的正则匹配相关操作技巧,需要的朋友可以参考下
java正则表达式 过滤特殊字符的正则表达式
java 使用正则表达式验证电话号码的格式 java 使用正则表达式验证电话号码的格式
java,正则表达式,详解,java正则表达式,PDF
Java根据正则表达式生成字符串,包括了Xeger和automaton
Java 使用正则表达式对象实现正则的获取功能 Java 使用正则表达式对象实现正则的获取功能
主要介绍了java使用正则表达式判断手机号的方法,分析了手机号码段的原理及java使用正则表达式针对手机号的匹配操作实现技巧,需要的朋友可以参考下
java正则表达式过滤html标签
java正则表达式详解java正则表达式详解java正则表达式详解java正则表达式详解java正则表达式详解java正则表达式详解java正则表达式详解
java正则表达式java正则表达式java正则表达式java正则表达式java正则表达式java正则表达式
java使用正则表达式进行校验验证,主要使用了Pattern和Matcher类,直接main方法运行就可以,亲测有效
java通过正则表达式匹配获取MAC(支持windows和Linux)
正则表达式之道.doc 正则表达式中的特殊字符.doc Java正则表达式详解.doc 正则表达式.ppt JAVA正则表达式--Pattern和Matcher.doc 例子
NULL 博文链接:https://duanhengbin.iteye.com/blog/1962431
/*********使用方法**************/ --正则校验(符合为1,不符合为0) SELECT [dbo].[Regex.IsMatch]('^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$','dyuanrong2010@163.com') 符合验证, [dbo].[Regex...
JAVA正则表达式JAVA正则表达式JAVA正则表达式
java 利用正则表达式从字符串中提取省、市、区、镇、乡等区域名称(包含少数民族地区),支持地址中无省,无市,无县情况。