`

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) {
	}

}

 

 

分享到:
评论

相关推荐

    SQL注入攻击实验报告

    1. **判断Web环境是否可以SQL注入**:分析URL,确定是否存在可用于数据库查询的参数。 2. **寻找SQL注入点**:向可能的注入点输入特殊字符,观察返回结果,以此判断数据库类型和版本。 3. **猜解用户名和密码**:...

    Sql Server参数化查询之where in和like实现详解

    在Sql Server中,参数化查询是提高查询性能和防止SQL注入攻击的有效方法之一。其中,where in和like是两个常用的查询条件,然而它们的参数化实现却不是那么简单。本文将详细介绍where in和like的参数化查询实现方法...

    C#高效连接sql数据库 防sql 注入

    通过对C#高效连接SQL数据库以及防止SQL注入的介绍,我们可以看出,合理地使用`SqlConnection`类以及采用参数化查询或存储过程的方法不仅能够提高程序的性能,还能够极大地增强系统的安全性。在实际开发中,建议...

    ASP.Net防SQL注入的HttpMoudule

    - **参数化查询**:推荐使用存储过程或参数化的SQL语句,这样可以避免SQL注入,因为即使输入了恶意代码,也不会被解释为SQL命令的一部分。 - **转义特殊字符**:对所有SQL关键字和操作符进行转义,防止它们被用作...

    sql注入过滤字典.txt

    1. **参数化查询**:使用预编译语句和参数化查询可以有效避免SQL注入。 2. **输入验证**:对用户输入进行严格的验证和清理。 3. **最小权限原则**:确保应用程序使用的数据库账户只拥有完成其任务所需的最小权限。 4...

    基于隐马尔可夫模型的新型SQL注入攻击检测方法.pdf

    SQL注入攻击是一种常见的网络攻击方式,攻击者通过插入恶意的SQL代码到Web表单或URL中,以此来欺骗数据库服务器执行非法的数据库操作。由于SQL注入攻击的普遍性和危害性,其在OWASP(开放式网络应用安全项目)的十大...

    ASP源码—SQL通用防注入程序零点完美版.zip

    3. **预编译语句或参数化查询**:使用预编译的SQL语句,将用户输入作为参数传递,而不是直接拼接在SQL语句中,防止SQL注入。 4. **限制SQL操作权限**:为Web应用程序的数据库连接分配最小权限,只允许执行必要的查询...

    人工智能-项目实践-数据预处理-SQL语句分析、内置变量预处理、命名参数支持以及关系数据库访问与写入

    例如,在Java中,使用PreparedStatement对象可以实现命名参数,这样不仅能防止SQL注入攻击,还可以提高代码的可复用性。 最后,关系数据库的访问与写入是数据预处理流程中的关键步骤。关系数据库如MySQL、Oracle或...

    Hibernate 在查询操作中要使用分页+命名参数+排序技术

    在SQL语句中,使用预编译参数可以防止SQL注入攻击,提高代码可读性和可维护性。Hibernate支持两种参数风格:占位符风格(如:`?`)和命名参数(如:`:paramName`)。命名参数更具优势,因为它使得参数的位置不依赖于...

    获取操作数据库的sql并输出带参数的

    `或命名参数`:param`)代替具体的值。在执行时,这些值会被安全地绑定到SQL语句中,避免了直接拼接字符串可能导致的注入风险。 例如,使用Java的JDBC,你可以创建一个PreparedStatement对象,如下所示: ```java ...

    ASP.NET SQL注入防范探微.pdf

    同时,可以使用`System.Web.Security`命名空间下的`SqlMembershipProvider`类进行用户认证和角色管理,它已经内置了防止SQL注入的措施。对于自定义的SQL操作,应使用`SqlCommand`对象的`Parameters`集合添加参数,而...

    注入表段强大字典

    SQL注入是一种常见的Web应用程序攻击方式,攻击者通过将恶意SQL代码插入到Web表单、URL参数或其他输入中,以期达到控制或获取数据库中敏感信息的目的。这种攻击利用了Web应用程序对用户输入的不充分过滤,导致恶意...

    从软件开发角度谈SQL注入攻击的防范 (1).pdf

    当应用程序通过存储过程将输入值参数化后,数据库服务器不会将这些参数视为SQL指令的一部分,而是在SQL指令编译后才套用参数运行,从而避免了大多数SQL注入的风险。 除此之外,合理设计错误返回策略也很关键。当...

    SQL参数实例大全

    8. 参数化查询:防止SQL注入,提高代码可读性和可维护性,实例可能包括预编译语句和动态SQL。 9. 子查询:嵌套在其他SQL语句中的查询,用于返回单个值、多个值或行集。 10. 视图:创建虚拟表,基于一个或多个表的...

    C#实现登陆程序(MD5加密和SQL存储过程防注入攻击)

    在登录程序中,使用存储过程可以有效防止SQL注入攻击,因为它们允许预定义的、安全的参数化查询。 防止SQL注入攻击的方法包括: 1. 使用存储过程接收输入参数,而不是直接拼接SQL字符串。 2. 在存储过程中进行参数...

    在Sql Server查询语句中能不能用变量表示表名

    在拼接SQL语句时,始终应该使用参数化查询,而不是直接插入变量值,以避免潜在的安全问题。 标签中提到的“源码”可能指的是存储过程中的源代码,因为这是使用变量表示表名的常见场景。而“工具”可能指的是SQL ...

    ASP.NET防范SQL注入式攻击的方法

    通过使用参数化查询、转义特殊字符、限制输入长度、使用存储过程和严格的数据验证等措施,可以有效地降低SQL注入式攻击的风险。确保***应用安全需要开发者细心、全面地考虑安全问题,采用正确的技术手段来避免潜在的...

    SqlParameter的简单应用实现[C#]

    SqlParameter是System.Data.SqlClient命名空间中的一个类,它用于在执行SQL命令时传递参数。这个类的作用主要体现在两个方面:防止SQL注入和提高查询性能。SQL注入是一种常见的网络安全攻击,攻击者通过输入恶意SQL...

    基于ASP的360通用ASP防护代码(防sql注入).zip

    4. **参数化查询**:一种有效的SQL注入防护策略,通过使用预编译的SQL语句和参数,而不是将用户输入直接拼接到SQL字符串中。 5. **存储过程**:使用存储过程可以限制对数据库的直接访问,减少SQL注入的风险。 6. **...

    最有用有效的php中防止sql注入_.docx

    这种方式同样阻止了SQL注入,因为参数值不会被解释为SQL代码的一部分。 预处理语句和参数化查询的好处在于,它们使得数据库能够区分用户提供的数据和SQL语句结构,从而消除注入攻击的可能性。无论用户输入的是什么...

Global site tag (gtag.js) - Google Analytics