`

sql命名参数注入

阅读更多
package com.piend.tongzhan.common.util;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class SQLUtils {
	private PreparedStatement ps;
	private Map<Integer, String> indexMap = new HashMap<Integer, String>();

	public SQLUtils(Connection conn, String orgSql) {
		int n = 0, lastIndex = 0, index = 0;
		for (int i = 0; i < orgSql.length(); i++) {
			if (orgSql.charAt(i) == '#') {
				n++;
			}
			if (n % 2 == 0 && orgSql.charAt(i) == '#') {
				index++;
				this.indexMap.put(index, orgSql.substring(lastIndex + 1, i));
			}
			if (orgSql.charAt(i) == '#') {
				lastIndex = i;
			}
		}
		for (Integer i : this.indexMap.keySet()) {
			orgSql = orgSql.replace("#" + this.indexMap.get(i) + "#", "?");
		}
		try {
			System.out.println(orgSql);
			this.ps = conn.prepareStatement(orgSql);
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	public PreparedStatement getPs() {
		return ps;
	}

	public Map<Integer, String> getIndexMap() {
		return indexMap;
	}

	public void setString(String name, String value) throws SQLException {
		try {
			for (Integer i : this.indexMap.keySet()) {
				if (name.equals(indexMap.get(i))) {
					ps.setString(i, value);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void setLong(String name, Long value) throws SQLException {
		try {
			for (Integer i : this.indexMap.keySet()) {
				if (name.equals(indexMap.get(i))) {
					ps.setLong(i, value);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void setDouble(String name, Double value) throws SQLException {
		try {
			for (Integer i : this.indexMap.keySet()) {
				if (name.equals(indexMap.get(i))) {
					ps.setDouble(i, value);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void setInt(String name, Integer value) throws SQLException {
		try {
			for (Integer i : this.indexMap.keySet()) {
				if (name.equals(indexMap.get(i))) {
					ps.setInt(i, value);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void setDate(String name, Date value) {
		try {
			for (Integer i : this.indexMap.keySet()) {
				if (name.equals(indexMap.get(i))) {
					ps.setDate(i, new java.sql.Date(value.getTime()));
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void setBigDecimal(String name, BigDecimal value) {
		try {
			for (Integer i : this.indexMap.keySet()) {
				if (name.equals(indexMap.get(i))) {
					ps.setBigDecimal(i, value);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void setObject(String name, Object value) {
		try {
			for (Integer i : this.indexMap.keySet()) {
				if (name.equals(indexMap.get(i))) {
					ps.setObject(i, value);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// 设置所有Map参数
	public void setAllMap(Map<String, Object> paraData) {
		try {
			for (Integer i : this.indexMap.keySet()) {
				for (String para : paraData.keySet()) {
					if (para.equals(indexMap.get(i))) {
						ps.setObject(i, paraData.get(para));
						break;
					}
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// 设置所有的javaBean
	public void setAllBean(Object bean) {
		Field fields[] = bean.getClass().getDeclaredFields();
		Field.setAccessible(fields, true);
		try {
			for (Integer i : this.indexMap.keySet()) {
				for (int j = 0; j < fields.length; j++) {
					if (fields[j].getName().equals(indexMap.get(i))) {
						ps.setObject(i, fields[j].get(bean));
						break;
					}
				}
			}
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
	}

}

 

 

分享到:
评论

相关推荐

    PHP100视频教程 53:PHP如何防止注入及开发安全.rar

    SQL Injection,即SQL注入。 受影响的系统:对输入的参数不进行检查和过滤的系统 正常来讲,我们通过地址接收一些必要的参数如: PHP100.php?id=2 页面中我们会使用 2 写入到SQL语句中 正常情况:Select * ...

    PHP100视频教程 53:PHP如何防止注入及开发安全

    1、PHP注入的基本原理 程序员的水平及经验也参差不齐,相当大一部分程序员...$_POST $_GET $_SESSION 等接受参数,并加以过滤4、提高数据库命名技巧,对于一些重要的字段可根据程序特点命名5、对于常用方法加以封装,

    NoSQL自动攻击测试工具NoSQLMap.zip

    针对MongoClient的PHP应用程序参数注入攻击,返回所有数据库中的记录。Javascript函数变量转移和任意代码注入,返回所有数据库中的记录。类似于盲SQL注入的用于验证无来自应用程序的反馈的Javascript注入漏洞的时序...

    FluentData微型ORM v2.3.0源码2012813

    安全,使用索引或命名参数,以防止SQL注入。 强大的性能。 可以对任何现有的业务对象和业务层不需要任何FluentData引用。 作为一个组件(DLL),并作为一个单一的源代码文件。 高级功能 Transactions 多个结果集 - ...

    Java正则表达式的总结和一些小例子

    在 Java 中,通过适当命名的 Pattern 类可以容易确定 String 是否匹配某种模式。模式可以象匹配某个特定的 String 那样简单,也可以很复杂,需要采用分组和字符类,如空白、数字、字母或控制符。 Pattern 类的方法...

    嘉缘人才网站管理系统 3.2 GBK.rar

    执行效率更高13、优化四大会员中心各项功能14、修复部分页面参数过滤不严...SQL注入漏洞19、修复参数问题导致的重复安装问题20、更新会员审核机制及职位简历审核机制21、全新发布3.2前台模版22、全新发布3.2会员系统...

    iBATIS实战

    4.2.3 SQL注入简介 72 4.2.4 自动结果映射 73 4.2.5 联结相关数据 74 4.3 映射参数 75 4.3.1 外部参数映射 75 4.3.2 再论内联参数映射 76 4.3.3 基本类型参数 78 4.3.4 JavaBean参数和Map参数 78 4.4 使用内联结果...

    N1QlInjection:针对Couchbase Server 4.0的N1QL注入攻击示例

    使用命名或位置参数,而不是将用户输入直接插入查询中 如果将用户输入直接插入查询中,请用一对单引号('')对用户输入字符串(')中的单引号进行转义 从查询中删除注释并放入代码中(这是附加的保护层) 使用对号...

    嘉缘人才网站系统 v3.2 GBK

    嘉缘人才系统php版,全新研发,功能...18、修复企业形象3D图片墙存在的SQL注入漏洞 19、修复参数问题导致的重复安装问题 20、更新会员审核机制及职位简历审核机制 21、全新发布3.2前台模版 22、全新发布3.2会员系统模版

    ZYCH自由策划婚纱摄影网站管理系统 v02 Build150518.rar

    安全设置:SQL注入管理,后台可设置SQL防注入参数等,SQL注入记录,可封锁攻击者IP等。 后台登陆记录:可查看管理员登陆的相关记录、IP、登陆时间等。 页面管理:创建和管理企业资料如:企业简介、企业荣誉、相关...

    ZYCH自由策划婚纱摄影网站管理系统 v02 Build160531.zip

    安全设置:SQL注入管理,后台可设置SQL防注入参数等,SQL注入记录,可封锁攻击者IP等。 后台登陆记录:可查看管理员登陆的相关记录、IP、登陆时间等。 页面管理:创建和管理企业资料如:企业简介、企业荣誉、相关...

    Vulnerabilities_Hardening

    第15单元提交文件:Web漏洞和强化 第1部分:问答 URL巡航导弹 URL是Web的网关,为用户提供对所有可用在线资源的不受限制的访问权限。... 答:跨站点脚本代码注入SQL注入EMAIL标头 注射攻击利用了CIA三合会的哪

    MyQEE(麦琪) 3.0.0 RC2.zip

    MyQEE内置XSS过滤机制,并且提供Database QueryBuilder组件可有效防止SQL注入。 4.提供技术人员开发调试工具 借助于多年团队开发经验,我们提供了比较实用的开发工具,包括本地调试环境的开启,远程调试环境,...

    mysql数据库开发规范【推荐】

    最近一段时间一边在线上抓取SQL来优化,一边在整理这个开发规范,尽量减少新的问题SQL进入生产库。...(1)MySQL有配置参数lower_case_table_names=1,即库表名以小写存储,大小写不敏感。如果是0,则库表名以实际情况

    Hibernate实战(第2版 中文高清版)

     5.3.6 参数化定制类型   5.3.7 映射枚举   5.4 小结   第6章 映射集合和实体关联   6.1 值类型的set、bag、list和map   6.1.1 选择集合接口   6.1.2 映射set   6.1.3 映射标识符bag   6.1.4 映射...

    基于模板的代码生成器LKGenerator1.1.0_x86

    (1)本工具提供了3中连接数据库的方式,分别是:MySql、Oracle、SqlServer,在界面上给出连接示例,方便进行复制和修改(减少因错误配置连接方式而带来了不能链接数据库问题)。配置正确后即可正确读取出数据库中的...

    asp.net知识库

    最详细的SQL注入相关的命令整理 Oracle Oracle中PL/SQL单行函数和组函数详解 mssql+oracle Oracle编程的编码规范及命名规则 Oracle数据库字典介绍 0RACLE的字段类型 事务 CMT DEMO(容器管理事务演示) 事务隔离性的...

    基于模板的代码生成器LKGenerator1.1.0_x64

    (1)本工具提供了3中连接数据库的方式,分别是:MySql、Oracle、SqlServer,在界面上给出连接示例,方便进行复制和修改(减少因错误配置连接方式而带来了不能链接数据库问题)。配置正确后即可正确读取出数据库中的...

    EaglePHP开源框架 v2.7.rar

    13、高安全性,内置filter组件实现过滤机制,防止sql注入及xss跨站脚本攻击。 14、支持orm,真正实现OOP开发的快捷且性能优越。 15、内置document输出模块,为指定项目生成chm或html格式的api开发手册。 EaglePHP...

    EaglePHP开源框架 v2.7.zip

    13、高安全性,内置filter组件实现过滤机制,防止sql注入及xss跨站脚本攻击。 14、支持orm,真正实现OOP开发的快捷且性能优越。 15、内置document输出模块,为指定项目生成chm或html格式的api开发手册。    ...

Global site tag (gtag.js) - Google Analytics