重庆网站建设外包公司排名,蓝色织梦cms企业网站模板全站源码,职业生涯规划ppt免费模板,网站后台浏览器1 原理
没有正确的对用户的输入进行检查#xff0c;将用户的输入以拼接的方式带入到SQL语句中#xff0c;导致SQL注入。
2 产生SQL注入的原因
2.1 JDBC拼接不当造成SQL注入 前置知识#xff1a; JDBC执行SQL语句的两种方式#xff1a; PrepareStatement#xff1a;会对…1 原理
没有正确的对用户的输入进行检查将用户的输入以拼接的方式带入到SQL语句中导致SQL注入。
2 产生SQL注入的原因
2.1 JDBC拼接不当造成SQL注入 前置知识 JDBC执行SQL语句的两种方式 PrepareStatement会对sql语句进行预编译效率和安全性更好。支持使用对变量位进行占位。Statement每次执行时都需要编译 典型的错误拼接方式 String sqlselect * from user where id req.getParameter(id);
Statement st con.createStatement();
ResultSet rs st.executeQuery(sql);正确的拼接方式使用占位符 String sqlselect * from user where id?;
PreparedStatement pstt con.PreparedStatement(sql);
pstt.setInt(1,Integer.parseInt(req.getParameter(id)));
ResultSet rs pstt.executeQuery();防御使用PreparedStatement,且不要把用户输入的东西拼到SQL语句里。
2.2 框架使用不当造成sql注入
① MyBatis框架 SQL传参的两种方式#{parameter}、${parameter} 思想将SQL语句编入到配置文件中避免SQL语句在Java程序中大量出现方便后续对SQL语句的修改与配置。 #与$的区别 #{}可以试用进行预编译安全推荐使用。 eg:如下代码 select idgetUsername resultTypecom.zlong.bean.Userselect id,name,age from user where name #{name}
/select其中将#{name}先使用占位进行预编译然后再传参不存在sql注入的问题。 ${}直接拼接到语句中不安全 eg:如下代码 select idgetUsername resultTypecom.zlong.bean.Userselect id,name,age from user where name ${name}
/select该代码直接将用户的值拼接到sql语句中可以触发恶意的代码。
② Hibernate框架
Hibernate框架是持久性API因此是对持久化类的对象进行操作而不是直接对数据库语句由Hibernate进行解析。它是将JAVA类映射到数据库表中从JAVA数据类型映射到SQL数据类型。直接拼接可能会导致注入漏洞。
使用以下HQL参数绑定的方法(预编译)避免注入漏洞 位置参数 String parameter z1ng;
QueryUser query session.createQuery(from com.z1ng.bean.User where name ?1,User.class);
query.setParameter(1,parameter);命名参数 String parameter z1ng;
QueryUser query session.createQuery(from com.z1ng.bean.User where name :name,User.class);
query.setParameter(name,parameter);命名参数列表 Liststring names Arrays.asList(z1ng,z2ng);
QueryUser query session.createQuery(from com.z1ng.bean.User where names in (:names),User.class);
query.setParameter(names,names);类实例Bean user1.setName(z1ng);
QueryUser query session.createQuery(from com.z1ng.bean.User where name :name,User.class);
query.properties(user1);参数绑定的方法构造SQL语句Hibernate支持原生SQL语句执行 正确的参数绑定方法 QueryUser query session.createNativeQuery(select * from user where name :name);
query.setParameter(name,parameter);错误的拼接方法 QueryUser query session.createNativeQuery(select * from user where name parameter);2.3 防御不当造成SQL注入
预防SQL注入漏洞一般正确使用预编译就可以但是存在特殊情况不可以使用预编译sql注入的order by后的参数赋值就不能使用预编译进行防止SQL注入。故除预编译之外需要对用户的输入进行严格的过滤包括参数类型参数格式。