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) { } }
相关推荐
1. **判断Web环境是否可以SQL注入**:分析URL,确定是否存在可用于数据库查询的参数。 2. **寻找SQL注入点**:向可能的注入点输入特殊字符,观察返回结果,以此判断数据库类型和版本。 3. **猜解用户名和密码**:...
在Sql Server中,参数化查询是提高查询性能和防止SQL注入攻击的有效方法之一。其中,where in和like是两个常用的查询条件,然而它们的参数化实现却不是那么简单。本文将详细介绍where in和like的参数化查询实现方法...
通过对C#高效连接SQL数据库以及防止SQL注入的介绍,我们可以看出,合理地使用`SqlConnection`类以及采用参数化查询或存储过程的方法不仅能够提高程序的性能,还能够极大地增强系统的安全性。在实际开发中,建议...
- **参数化查询**:推荐使用存储过程或参数化的SQL语句,这样可以避免SQL注入,因为即使输入了恶意代码,也不会被解释为SQL命令的一部分。 - **转义特殊字符**:对所有SQL关键字和操作符进行转义,防止它们被用作...
1. **参数化查询**:使用预编译语句和参数化查询可以有效避免SQL注入。 2. **输入验证**:对用户输入进行严格的验证和清理。 3. **最小权限原则**:确保应用程序使用的数据库账户只拥有完成其任务所需的最小权限。 4...
SQL注入攻击是一种常见的网络攻击方式,攻击者通过插入恶意的SQL代码到Web表单或URL中,以此来欺骗数据库服务器执行非法的数据库操作。由于SQL注入攻击的普遍性和危害性,其在OWASP(开放式网络应用安全项目)的十大...
3. **预编译语句或参数化查询**:使用预编译的SQL语句,将用户输入作为参数传递,而不是直接拼接在SQL语句中,防止SQL注入。 4. **限制SQL操作权限**:为Web应用程序的数据库连接分配最小权限,只允许执行必要的查询...
例如,在Java中,使用PreparedStatement对象可以实现命名参数,这样不仅能防止SQL注入攻击,还可以提高代码的可复用性。 最后,关系数据库的访问与写入是数据预处理流程中的关键步骤。关系数据库如MySQL、Oracle或...
在SQL语句中,使用预编译参数可以防止SQL注入攻击,提高代码可读性和可维护性。Hibernate支持两种参数风格:占位符风格(如:`?`)和命名参数(如:`:paramName`)。命名参数更具优势,因为它使得参数的位置不依赖于...
`或命名参数`:param`)代替具体的值。在执行时,这些值会被安全地绑定到SQL语句中,避免了直接拼接字符串可能导致的注入风险。 例如,使用Java的JDBC,你可以创建一个PreparedStatement对象,如下所示: ```java ...
同时,可以使用`System.Web.Security`命名空间下的`SqlMembershipProvider`类进行用户认证和角色管理,它已经内置了防止SQL注入的措施。对于自定义的SQL操作,应使用`SqlCommand`对象的`Parameters`集合添加参数,而...
SQL注入是一种常见的Web应用程序攻击方式,攻击者通过将恶意SQL代码插入到Web表单、URL参数或其他输入中,以期达到控制或获取数据库中敏感信息的目的。这种攻击利用了Web应用程序对用户输入的不充分过滤,导致恶意...
当应用程序通过存储过程将输入值参数化后,数据库服务器不会将这些参数视为SQL指令的一部分,而是在SQL指令编译后才套用参数运行,从而避免了大多数SQL注入的风险。 除此之外,合理设计错误返回策略也很关键。当...
8. 参数化查询:防止SQL注入,提高代码可读性和可维护性,实例可能包括预编译语句和动态SQL。 9. 子查询:嵌套在其他SQL语句中的查询,用于返回单个值、多个值或行集。 10. 视图:创建虚拟表,基于一个或多个表的...
在登录程序中,使用存储过程可以有效防止SQL注入攻击,因为它们允许预定义的、安全的参数化查询。 防止SQL注入攻击的方法包括: 1. 使用存储过程接收输入参数,而不是直接拼接SQL字符串。 2. 在存储过程中进行参数...
在拼接SQL语句时,始终应该使用参数化查询,而不是直接插入变量值,以避免潜在的安全问题。 标签中提到的“源码”可能指的是存储过程中的源代码,因为这是使用变量表示表名的常见场景。而“工具”可能指的是SQL ...
通过使用参数化查询、转义特殊字符、限制输入长度、使用存储过程和严格的数据验证等措施,可以有效地降低SQL注入式攻击的风险。确保***应用安全需要开发者细心、全面地考虑安全问题,采用正确的技术手段来避免潜在的...
SqlParameter是System.Data.SqlClient命名空间中的一个类,它用于在执行SQL命令时传递参数。这个类的作用主要体现在两个方面:防止SQL注入和提高查询性能。SQL注入是一种常见的网络安全攻击,攻击者通过输入恶意SQL...
4. **参数化查询**:一种有效的SQL注入防护策略,通过使用预编译的SQL语句和参数,而不是将用户输入直接拼接到SQL字符串中。 5. **存储过程**:使用存储过程可以限制对数据库的直接访问,减少SQL注入的风险。 6. **...
这种方式同样阻止了SQL注入,因为参数值不会被解释为SQL代码的一部分。 预处理语句和参数化查询的好处在于,它们使得数据库能够区分用户提供的数据和SQL语句结构,从而消除注入攻击的可能性。无论用户输入的是什么...