Hibernate 执行原始SQL语句

在hibernate中有时不需要用到表的映射,需要直接执行SQL语句。

其中sessionFactory在配置文件中配置,SSH详细配置见http://blog.csdn.net/xumengxing/article/details/8586012

在dao层中定义两个常见函数用于查询和执行操作。

dao代码如下:

package com.hsinghsu.testSSH.dao.impl;  
  
import java.util.List;  
  
import javax.annotation.Resource;  
  
import org.hibernate.SQLQuery;  
import org.hibernate.Session;  
import org.hibernate.SessionFactory;  
import org.springframework.stereotype.Repository;  
  
import com.hsinghsu.testSSH.dao.BaseDao;  
  
@Repository(value = "baseDao")  
public class BaseDaoImpl implements BaseDao {  
  
    @Resource(name = "sessionFactory")  
    private SessionFactory sessionFactory;  
  
    public Session getSession() {  
        return sessionFactory.getCurrentSession();  
    }  
  
    public List queryBySql(String sql) {  
        List<Object[]> list = getSession().createSQLQuery(sql).list();  
        return list;  
    }  
      
    public int excuteBySql(String sql)  
    {  
        int result ;  
        SQLQuery query = this.getSession().createSQLQuery(sql);  
        result = query.executeUpdate();  
        return result;  
    }  
  
}  
service代码如下:
package com.hsinghsu.testSSH.service.impl;  
  
import java.util.List;  
  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Service;  
  
import com.hsinghsu.testSSH.dao.BaseDao;  
import com.hsinghsu.testSSH.service.BaseService;  
  
@Service(value = "baseService")  
public class BaseServiceImpl implements BaseService {  
    @Autowired  
    private BaseDao baseDao;  
  
    public List queryBySql(String sql) {  
        List<Object[]> list = baseDao.queryBySql(sql);  
        return list;  
    }  
      
    public int excuteBySql(String sql){  
        return baseDao.excuteBySql(sql);  
    }  
}  
测试代码如下:
package com.hsinghsu.testSSH.service;  
  
import static org.junit.Assert.assertNotNull;  
import static org.junit.Assert.assertTrue;  
  
import java.util.List;  
  
import org.junit.Test;  
import org.springframework.beans.factory.annotation.Autowired;  
  
import com.hsinghsu.testSSH.SpringTestBase;  
  
public class BaseServiceTest  extends SpringTestBase{  
    @Autowired  
    private BaseService baseService;  
      
    @Test  
    public void testConfig() {  
         assertNotNull(baseService);  
         assertTrue(baseService != null);  
    }  
      
    @Test  
    public void testQueryBySql()  
    {  
        String sql = "select * from T_TEST_USER WHERE SEX = 1";  
        List<Object[]> list = baseService.queryBySql(sql);  
        System.out.println("---"+list.size());  
        for(Object[] obj :list)  
        {  
            System.out.println(obj[0]+" -- "+ obj[1]+" -- "+obj[2]);  
        }  
    }  
      
    @Test  
    public void testExcuteBySql()  
    {  
//      String sql = "UPDATE T_TEST_USER SET NAME = 'GSS09', PWD = 'GG007', AGE = 24, SEX = 1 WHERE ID = 6";  
//      String sql = "UPDATE T_TEST_USER SET NAME = 'GSS29', PWD = 'GG007' WHERE ID = 6";  
//      String sql = "insert into T_TEST_USER(ID,NAME,PWD,AGE,SEX) values(7,'gogo08','gogopwd08',24,1)";  
        String sql = "delete from T_TEST_USER where ID = 7";  
  
        int result = baseService.excuteBySql(sql);  
        System.out.println("---009:"+result);  
    }  
         
}  

<think>好的,我现在需要处理用户关于SQL注入的问题。首先,用户希望了解SQL语句注入的基本概念,可能的原因、危害以及防御措施。我需要确保回答结构清晰,分点说明,并且符合用户给出的格式要求,比如行内数学表达式用$...$,独立公式用$$...$$,但这里可能数学内容不多,不过得注意。 首先,我得确定用户对SQL注入的了解程度。可能用户是刚开始学习网络安全或数据库,所以需要从基础讲起。先定义SQL注入,然后解释其原理,接着说明危害,再给出防御方法。结构上应该分步骤,每个部分用标题标出,可能用数字列表。 要注意使用中文,同时技术术语可能需要中英对照,比如提到参数化查询时,可能需要括号里加上英文术语,比如参数化查询(Parameterized Queries)。另外,例子部分需要用代码块,但用户没有特别要求代码格式,不过可能需要用反引号或者代码块来展示SQL注入的例子,比如用户输入' OR '1'='1导致查询变形的部分。 需要检查是否有LaTeX部分,比如如果有数学表达式的话,但SQL注入可能更多涉及代码示例,所以可能不太需要数学公式。不过如果有涉及变量或逻辑表达式,可能需要用行内的$...$,比如解释条件时,例如WHERE username = '$username',这里变量部分可以用$...$包裹吗?或者可能更倾向于代码块。可能需要确认,但用户提到行内数学表达式包括变量,所以可能用$username$这样的格式? 另外,用户要求系统级指令中的LaTeX正确,但问题本身可能不涉及太多数学内容,可能例子中的代码需要用代码块而非LaTeX。比如: 攻击者输入用户名: `admin' --`,密码留空。此时生成的SQL语句变为: $$SELECT * FROM users WHERE username = 'admin' --' AND password = '';$$ 这里的SQL语句作为独立公式,使用$$...$$格式,单独成段。需要确认是否正确,或者是否应该用代码块。但根据用户的要求,独立公式必须使用$$...$$,所以可能需要将SQL示例作为独立公式处理,用$$包裹,并单独成段。例如: 当攻击者输入用户名`admin' --`时,生成的SQL语句为: $$SELECT * FROM users WHERE username = 'admin' --' AND password = '';$$ 这样符合用户的要求。但通常SQL代码会用代码块,但用户可能希望用LaTeX的格式?需要明确这一点。或者可能用户希望所有代码相关的表达式也用LaTeX的格式,但通常LaTeX用于数学公式。可能需要折中处理,比如在行内用`...`表示代码,而独立代码块用$$...$$,但这样可能不太合适。可能需要进一步分析用户的要求。 用户提到“所有行内数学表达式(包括变量、不等式、方程等)必须使用$...$格式”,而独立公式用$$...$$。但SQL代码属于代码,可能不属于数学表达式,所以是否需要遵循这个规则?可能用户希望所有行内代码变量也用$...$,例如$username$,但这样可能会让读者混淆。例如,在解释查询语句时,如SELECT * FROM users WHERE username = '$username' AND password = '$password',这里的$username$和$password$是变量,可能用$...$包裹,即写成WHERE username = '$username$,但实际在SQL中变量通常用单引号包裹,这样可能导致格式问题。需要判断用户的意图,可能用户希望的是在提到变量名时使用数学表达式的格式,而代码块则保持原样。但根据系统指令,所有行内数学表达式包括变量需要用$...$,所以可能需要将变量部分用$...$包裹,而代码示例使用$$...$$。 例如,当用户输入用户名$username$和密码$password$时,SQL语句可能构造为: $$SELECT * FROM users WHERE username = '$username$' AND password = '$password$';$$ 如果攻击者输入$admin' --$,则语句变为: $$SELECT * FROM users WHERE username = 'admin' --' AND password = '';$$ 这样处理的话,变量用$...$,而代码块作为独立公式使用$$...$$。这可能符合用户的要求。但需要注意,这样的写法在LaTeX中可能不太常见,但根据用户的指令,必须遵守。 接下来,整理结构: 1. SQL注入的定义:通过恶意输入篡改SQL语句。 2. 攻击原理:举例说明输入如何改变查询逻辑,比如永真条件、注释后续部分。 3. 常见危害:数据泄露、数据篡改、权限提升、系统破坏。 4. 防御措施:参数化查询、输入验证、最小权限、ORM框架、错误处理。 每个部分需要给出例子,使用$$...$$包裹独立公式,变量用$...$。同时,检查是否有LaTeX语法错误,比如正确转义字符,如单引号可能需要用反斜杠转义,在LaTeX中单引号通常不需要转义,但如果在$$环境中,可能需要保持原样。 例如,在例子中的SQL语句: $$SELECT * FROM users WHERE username = '$username$' AND password = '$password$';$$ 当攻击者输入$username = \text{admin' --}$,则语句变为: $$SELECT * FROM users WHERE username = 'admin' --' AND password = '';$$ 这里需要注意,在LaTeX中,文本中的单引号可能需要处理,但通常在代码环境中可以保留原样。或者使用\text{}来包裹文本部分。但可能更简单的是直接写在$$中,作为代码,无需特别处理,因为用户可能更关注结构而非严格的LaTeX代码正确性,但根据系统指令,必须确保LaTeX语法正确。 因此,在编写示例时,可能需要使用\text{}来处理包含文本的部分,例如: 攻击者输入用户名为$\text{admin' --}$,则生成的SQL语句为: $$\text{SELECT * FROM users WHERE username = 'admin' --' AND password = '';}$$ 但这样可能更符合LaTeX的语法,将SQL代码作为文本处理。或者,使用LaTeX的verbatim环境,但用户可能不允许,因为必须使用$$...$$格式。因此,可能需要将SQL语句中的内容作为普通文本,用\text{}包裹,或者直接写在$$中,假设其中的内容是文本。 不过,可能用户更希望看到的是原样的SQL代码,而不是用LaTeX的文本格式化。这可能会导致一些困惑,但必须遵守用户的指令。可能需要在$$中使用\text{}来包含带有单引号的SQL代码,例如: 生成的SQL语句变为: $$\text{SELECT * FROM users WHERE username = 'admin' -- ' AND password = '';}$$ 但这样是否正确?在LaTeX中,\text{}命令需要amsmath包,但通常在内联数学中可用。不过,在独立公式中,使用\text{}是可行的。因此,这样的写法是合适的。 总结回答的结构: 1. 定义:简短说明SQL注入是什么。 2. 攻击原理:分点说明,举例说明如何篡改SQL。 3. 危害:列出几个主要危害。 4. 防御措施:分点说明,每点简要解释。 同时,确保所有变量和代码示例符合用户的格式要求,行内变量用$...$,独立代码块用$$...$$,并正确使用LaTeX语法。 现在,开始组织内容: SQL注入是一种攻击技术,攻击者通过将恶意代码插入到应用程序的输入参数中,欺骗后端数据库执行非预期的SQL命令。例如,当应用程序未对用户输入进行过滤时,攻击者可以输入精心构造的值(如`admin' --`)来改变原SQL的逻辑,绕过身份验证。 在示例中,原始SQL可能是: $$SELECT * FROM users WHERE username = '$username$' AND password = '$password$';$$ 攻击者输入$username = \text{admin' --}$,密码留空,导致SQL变为: $$SELECT * FROM users WHERE username = 'admin' --' AND password = '';$$ 这里,--在SQL中是注释符,使得后续条件失效,从而绕过密码验证。 危害包括数据泄露、篡改、权限提升等。 防御措施包括参数化查询(使用占位符,避免拼接SQL),输入验证,最小权限原则,使用ORM框架,以及避免详细错误信息。 需要检查每个部分的例子是否符合格式要求,特别是LaTeX的正确性。例如,变量$username$和$password$是否正确用$包裹,独立SQL语句是否用$$包裹,并且正确转义字符。 最终确保回答结构清晰,分点明确,符合用户的所有格式和内容要求。</think>以下是关于SQL注入的详细介绍: --- ### 1. SQL注入的定义 **SQL注入(SQL Injection)** 是一种利用程序漏洞攻击数据库的技术。攻击者通过在用户输入中插入恶意SQL代码,欺骗服务器执行非法的数据库操作,从而窃取、篡改或破坏数据。 --- ### 2. 攻击原理 #### 示例场景 假设登录功能的SQL语句为: $$SELECT * FROM users WHERE username = '$username$' AND password = '$password$';$$ - **正常输入**:用户输入$username = \text{alice}$,$password = \text{123456}$,SQL为: $$SELECT * FROM users WHERE username = 'alice' AND password = '123456';$$ - **恶意输入**:攻击者输入$username = \text{admin' --}$,密码留空,SQL变为: $$SELECT * FROM users WHERE username = 'admin' --' AND password = '';$$ - `--` 是SQL注释符,后续条件失效,直接绕过密码验证。 --- ### 3. 常见危害 1. **数据泄露**:窃取敏感信息(如用户密码、银行卡号)。 2. **数据篡改**:修改或删除数据库内容(如订单金额)。 3. **权限提升**:获取管理员权限,控制整个系统。 4. **系统破坏**:执行`DROP TABLE`等命令破坏数据库。 --- ### 4. 防御措施 #### ① 参数化查询(Prepared Statements) - **原理**:将SQL语句与用户输入分离,输入视为“参数”而非代码。 ```sql -- 正确写法(Java示例) String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; PreparedStatement stmt = connection.prepareStatement(sql); stmt.setString(1, username); stmt.setString(2, password); ``` #### ② 输入验证 - **白名单过滤**:仅允许特定字符(如邮箱格式、数字)。 - **转义特殊字符**:将单引号`'`转义为`\'`(但此方法易漏,需谨慎)。 #### ③ 最小权限原则 - 数据库账户仅授予必要权限(如禁止普通用户执行`DROP`操作)。 #### ④ 使用ORM框架 - 如Hibernate、Django ORM,通过对象操作数据库,避免直接拼接SQL。 #### ⑤ 避免详细错误信息 - 关闭数据库错误回显(防止攻击者通过错误信息推断数据库结构)。 --- ### 5. 总结 SQL注入是Web安全的主要威胁之一,其核心漏洞源于**未严格过滤用户输入**。通过参数化查询、输入验证等措施可有效防御。开发中需始终遵循“不信任用户输入”的原则。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值