Java安全编码之sql注入

这篇文章给大家聊聊关于java如何防sql攻击,以及hibernate 不建议 sql对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

本文目录

  1. java如何防sql攻击
  2. hibernate中执行hql和sql哪个效率更高
  3. ResultSet org.hibernate.exception.SQLGrammarException: could not extract ResultSet
  4. mybatis与hibernate有什么异同

java如何防sql攻击

java防SQL注入,最简单的办法是杜绝SQL拼接,SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用PreparedStatement来代替Statement来执行SQL语句,其后只是输入参数,SQL注入攻击手段将无效,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构,大部分的SQL注入已经挡住了,在WEB层我们可以过滤用户的输入来防止SQL注入比如用Filter来过滤全局的表单参数。下面就举三个例子来说明一下:

第一种:

采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setString方法传值即可,如下所示:

Stringsql="select*fromuserswhereusername=?andpassword=?;PreparedStatementpreState=conn.prepareStatement(sql);preState.setString(1,userName);preState.setString(2,password);ResultSetrs=preState.executeQuery();...

第二种:

采用正则表达式将包含有单引号('),分号(;)和注释符号(--)的语句给替换掉来防止SQL注入,如下所示:

publicstaticStringTransactSQLInjection(Stringstr)

{

returnstr.replaceAll(".*([';]+|(--)+).*","");

}

userName=TransactSQLInjection(userName);

password=TransactSQLInjection(password);

Stringsql="select*fromuserswhereusername='"+userName+"'andpassword='"+password+"'"

Statementsta=conn.createStatement();

ResultSetrs=sta.executeQuery(sql);

第三种:

使用Hibernate框架的SQL注入防范Hibernate是目前使用最多的ORM框架,在JavaWeb开发中,很多时候不直接使用JDBC,而使用Hibernate来提高开发效率。

在Hibernate中,仍然不应该通过拼接HQL的方式,而应使用参数化的方式来防范SQL注入。有两种方式,一种仍然是使用JDBC一样的占位符“?”,但更好的方式是使用Hibernate的命名参数,例如检测用户名和密码是否正确,使用Hibernate可以写成如下:

StringqueryStr=“fromuserwhereusername=:username”+”password=:password”;

Listresult=session.createQuery(queryStr).setString("username",username).setString("password",password).list();

hibernate中执行hql和sql哪个效率更高

效率高不高还是要看写出来的sql.如果对于相同的语句,个人觉得纯粹的SQL是比HQL高的,起码省去了把HQL转化为SQL的时间。不过HQL可以将结果封装成对象,而SQL不行,因此但就查询来讲纯粹的SQL效率高了(前提是SQL本身就很高效)。

ResultSet org.hibernate.exception.SQLGrammarException: could not extract ResultSet

检查下sql里是否有role这个字段。

看看数据库是否没有这个column。应该是sql和数据结构不匹配导致的。同时注意下role的大小写吧,有的时候数据库会区分大小写的。

mybatis与hibernate有什么异同

1、mybatis和hibernate有很多异同之处。2、因为mybatis是一种基于SQL语句和参数的映射关系管理,具有灵活性较高的特点,可以在SQL语句中编写自己的特定查询,而hibernate是一种基于ORM的框架,通过将数据库表映射到对象的属性来实现关系的维护和数据的访问。3、此外,MyBatis更加注重SQL的编写和调优,使用简单的CRUD操作,Hibernate更加注重实体类与数据库的映射,更适合开发大型系统,而且对于开发人员需要进行一些额外的配置和学习。

END,本文到此结束,如果可以帮助到大家,还望关注本站哦!

java开发SSM框架整合之MyBatis动态SQL