`

使用IBATIS防止sql注入

阅读更多

           对于ibaits参数引用可以使用#和$两种写法,其中#写法会采用预编译方式,将转义交给了数据库,不会出现注入问题;如果采用$写法,则相当于拼接字符串,会出现注入问题。

例如,如果属性值为“' or '1'='1 ”,采用#写法没有问题,采用$写法就会有问题。

        对于like语句,难免要使用$写法,

        1. 对于Oracle可以通过'%'||'#param#'||'%'避免;

        2. 对于MySQL可以通过CONCAT('%',#param#,'%')避免;

        3. MSSQL中通过'%'+#param#+'% 。 

        4. #与$区别:#xxx# 代表xxx是属性值,map里面的key或者是你的pojo对象里面的属性, ibatis会自动在它的外面加上引号,表现在sql语句是这样的 where xxx = 'xxx' ;

$xxx$ 则是把xxx作为字符串拼接到你的sql语句中, 比如 order by topicId , 语句这样写 ... order by #xxx# ibatis 就会把他翻译成 order by 'topicId' (这样就会报错) 语句这样写 ... order by $xxx$ ibatis 就会把他翻译成 order by topicId

 

 

        为了防止SQL注入,iBatis模糊查询时也要避免使用$$来进行传值。下面是三个不同数据库的ibatis的模糊查询传值。

Sql代码 复制代码 收藏代码
  1. mysql: select * from stu where name like concat('%',#name #,'%')     
  2.     
  3. oracle: select * from stu where name like '%'||#name #||'%'    
  4.     
  5. SQL Server:select * from stu where name like '%'+#name #+'%     



如:

Sql代码 复制代码 收藏代码
  1. <!-- 用途:小二后台查询活动的数目 -->   
  2.        <select id="countActivitySearch" resultClass="java.lang.Long" parameterClass="actDO">   
  3.         <![CDATA[   
  4.             select count(id) from activity    
  5.             ]]>   
  6.            
  7.         <dynamic prepend="WHERE">   
  8.             <isNotNull prepend=" AND " property="name">   
  9.                 name LIKE CONCAT('%', #name#, '%')   
  10.             </isNotNull>   
  11.             <isNotNull prepend=" AND "  property="itemId">   
  12.                 itemId = #itemId#   
  13.             </isNotNull>   
  14.             <isNotNull prepend=" AND " property="itemName">   
  15.                 itemName LIKE CONCAT('%', #itemName#, '%')   
  16.             </isNotNull>            
  17.             <isNotNull prepend=" AND " property="status">   
  18.                 status = #status#   
  19.             </isNotNull>    
  20.             <isNotNull prepend=" AND " property="actStatus">   
  21.                 actStatus = #actStatus#   
  22.             </isNotNull>             
  23.             <isNotNull prepend=" AND " property="domain">   
  24.                 domain LIKE CONCAT('%', #domain#, '%')   
  25.             </isNotNull>   
  26.         </dynamic>   
  27.            
  28.     </select>   
  29.        
  30.     <!-- 用途:小二后台查询活动的列表 -->   
  31.  
  32.     <select id="searchActivityForList" resultMap="actResult" parameterClass="actDO">   
  33.         <![CDATA[   
  34.             select * from activity    
  35.         ]]>   
  36.            
  37.         <dynamic prepend="WHERE">   
  38.             <isNotNull prepend=" AND " property="name">   
  39.                 name LIKE CONCAT('%', #name#, '%')   
  40.             </isNotNull>   
  41.             <isNotNull prepend=" AND "  property="itemId">   
  42.                 itemId = #itemId#   
  43.             </isNotNull>   
  44.             <isNotNull prepend=" AND " property="itemName">   
  45.                 itemName LIKE CONCAT('%', #itemName#, '%')   
  46.             </isNotNull>            
  47.             <isNotNull prepend=" AND " property="status">   
  48.                 status = #status#   
  49.             </isNotNull>    
  50.             <isNotNull prepend=" AND " property="actStatus">   
  51.                 actStatus = #actStatus#   
  52.             </isNotNull>             
  53.             <isNotNull prepend=" AND " property="domain">   
  54.                 domain LIKE CONCAT('%', #domain#, '%')   
  55.             </isNotNull>   
  56.         </dynamic>   
  57.            
  58.         <![CDATA[   
  59.             order by starttime desc, createtime desc  
  60.             limit    
  61.                 #startRow#, #perPageSize#      
  62.         ]]>   
  63.     </select>  


不要这样来写:

Sql代码 复制代码 收藏代码
  1. <select id="searchActivityForCount" resultClass="java.lang.Long" >   
  2.         <![CDATA[   
  3.             select count(*) from activity   
  4.             ]]>   
  5.            
  6.         <dynamic prepend="WHERE">   
  7.             <isNotNull prepend=" AND " property="name">   
  8.                 name LIKE '%$name$%'  
  9.             </isNotNull>   
  10.             <isNotNull prepend=" AND " property="itemId">   
  11.                 itemId LIKE '%$itemId$%'  
  12.             </isNotNull>   
  13.             <isNotNull prepend=" AND " property="itemName">   
  14.                 itemName LIKE '%$itemName$%'  
  15.             </isNotNull>            
  16.             <isNotNull prepend=" AND " property="status">   
  17.                 status = #status#   
  18.             </isNotNull>    
  19.             <isNotNull prepend=" AND " property="actStatus">   
  20.                 actStatus = #actStatus#   
  21.             </isNotNull>             
  22.             <isNotNull prepend=" AND " property="domain">   
  23.                 domain LIKE '%$domain$%'  
  24.             </isNotNull>   
  25.         </dynamic>   
  26.     </select>   
  27.        
  28.     <select id="searchActivityForList" resultMap="actResult" parameterClass="actDO">   
  29.         <![CDATA[   
  30.             select * from activity    
  31.         ]]>   
  32.            
  33.         <dynamic prepend="WHERE">   
  34.             <isNotNull prepend=" AND " property="name">   
  35.                 name LIKE '%$name$%'  
  36.             </isNotNull>   
  37.             <isNotNull prepend=" AND " property="itemId">   
  38.                 itemId LIKE '%$itemId$%'  
  39.             </isNotNull>   
  40.             <isNotNull prepend=" AND " property="itemName">   
  41.                 itemName LIKE '%$itemName$%'  
  42.             </isNotNull>            
  43.             <isNotNull prepend=" AND " property="status">   
  44.                 status = #status#   
  45.             </isNotNull>    
  46.             <isNotNull prepend=" AND " property="actStatus">   
  47.                 actStatus = #actStatus#   
  48.             </isNotNull>             
  49.             <isNotNull prepend=" AND " property="domain">   
  50.                 domain LIKE '%$domain$%'  
  51.             </isNotNull>   
  52.         </dynamic>   
  53.            
  54.         <![CDATA[   
  55.             order by starttime desc, createtime desc  
  56.             limit    
  57.                 #startRow#, #perPageSize#      
  58.         ]]>   
  59.     </select>  
分享到:
评论

相关推荐

    寻找sql注入的网站的方法(必看)

    方法一:利用google高级搜索,比如搜索url如.asp?... 您可能感兴趣的文章:Java面试题解析之判断以及防止SQL注入SQL注入原理与解决方法代码示例通过ibatis解决sql注入问题Win2003服务器防SQL注入神器–D盾_IIS防火墙

    ASP.NET MVC+iBatis+SQL

    3. **参数绑定**:在iBatis映射文件中,可以使用占位符绑定动态参数,实现SQL语句的参数化,提高安全性并防止SQL注入。 综上所述,这个项目演示了如何结合ASP.NET MVC、iBatis和SQL来构建一个简单的Web应用程序。...

    iBATIS-SqlMaps-2_cn.pdf

    此外,iBATIS支持预编译的PreparedStatement,能有效防止SQL注入攻击,提高执行效率。 总的来说,这份《iBATIS-SqlMaps-2_cn.pdf》文档全面涵盖了iBATIS框架的关键概念、配置和使用方法,是学习和使用iBATIS的重要...

    ibatis总结 ibatis ibatis ibatis ibatis

    例如,`select * from PRODUCT where PRD_CAT_ID = #{value}`中的`#{value}`是预编译参数,能有效防止SQL注入。 总结,Ibatis提供了灵活的SQL映射机制,使得开发人员能够更好地控制SQL的执行。同时,通过与Struts和...

    Ibatis资料ibatai sql map iBATIS使用$和#的一些理解

    通常情况下,`#`被用来防止SQL注入,它会将变量转化为预编译语句中的占位符。例如: ```sql select * from member where id = #id# ``` 当在Java代码中设置`id`为某个值时,iBATIS会将其转换为如下的预编译SQL: ...

    ibatis api 帮助文档+IBATIS 开发文档

    PreparedStatement支持预编译,提高性能并防止SQL注入;SimpleStatement则用于简单的SQL执行。 3. **ParameterMap**和**ParameterValuePair**:用于传递SQL查询参数。ParameterMap定义了参数和它们的映射关系,...

    iBATIS模糊查询

    1. 防止SQL注入攻击:在使用iBATIS进行模糊查询时,需要确保参数的安全性,以防止SQL注入攻击。例如,以下代码是错误的: ```sql SELECT * FROM t_stu WHERE s_name LIKE '%$name$%' ``` 这种代码容易受到SQL注入...

    ibatis基本操作数据库

    1. **参数绑定**:iBatis使用占位符(#{})进行参数绑定,可以防止SQL注入攻击。当使用#{paramName}时,iBatis会自动处理参数,将其转化为预编译SQL中的问号,类似于PreparedStatement在Java JDBC中的作用。 2. **...

    iBatis文档

    此外,iBatis支持预编译的PreparedStatement,以防止SQL注入攻击,并提供了强大的结果集映射功能,能够自动将查询结果转换为Java对象,甚至处理一对多、多对一等复杂关系。同时,它的事务控制灵活,既支持手动控制,...

    ibatis 入门

    #{ } 用于预编译的参数,能防止 SQL 注入;${} 则是简单的字符串替换,适用于非预编译场景。 7. **结果映射**:iBATIS 可以自动将查询结果映射到 Java 对象,无需手动处理。这包括自动类型转换、一对一、一对多等...

    ibatis-2.3

    PreparedStatement更安全,能有效防止SQL注入,而SimpleStatement则更适合简单的、不常变动的SQL。 标签“ibatis jar”表明这是一个包含Ibatis库的JAR文件,其中可能包括了`ibatis-core.jar`、`ibatis-sqlmap.jar`...

    ibatis官方中文文档

    `#{}` 语法用于参数绑定,它可以防止SQL注入。在SQL语句中,#{paramName}会被替换为预编译语句的占位符,参数值则在执行时传入。 5. **结果映射**: 结果映射定义了如何将查询结果映射到Java对象。`&lt;resultMap&gt;`...

    SQL.预编译.docx

    SQL预编译是数据库操作中的一个重要概念,...总的来说,SQL预编译是防止SQL注入和提升数据库操作性能的重要手段,尤其是在iBatis等框架中,应优先考虑使用PreparedStatement来编写动态SQL,确保应用的安全性和高效性。

    ibatis的使用,jar包,配置文件

    在SQL语句中,我们可以使用#{}和${}两种占位符,前者用于防止SQL注入,后者则会原样输出。 在实际使用中,我们首先需要创建一个SqlSessionFactoryBuilder,然后用其构建SqlSessionFactory。接着,通过...

    sql语句中用问号代替参数

    1. **防止SQL注入**:问号参数化能有效防止SQL注入攻击。因为它确保了用户输入的数据不会被解析为SQL代码,而是作为原始数据处理。即使用户尝试插入恶意SQL,数据库也会将它们视为普通字符串,而不会执行。 2. **...

    CodeSmith IBatis1.92模板

    7. **性能优化**:通过CodeSmith生成的代码通常会遵循最佳实践,例如,使用预编译的PreparedStatement来防止SQL注入并提升性能。 8. **版本控制**:生成的代码应纳入版本控制系统,如Git,以便团队协作和跟踪代码...

    ibatis中 $ 于 # 的 区别

    使用`#{}`的方式可以有效防止SQL注入攻击。这是因为预编译的方式会将参数作为独立的单元处理,而不是简单地拼接到SQL语句中。这种方式使得即使传入了恶意的SQL代码,也不会被执行。 - **#{} 对 SQL 注释的支持** ...

    夏昕-ibatis 开发指南pdf版

    同时,安全问题也不能忽视,比如防止SQL注入的策略。 总的来说,《夏昕-iBatis 开发指南》不仅覆盖了iBatis的基本用法,还深入探讨了其实战中的高级应用,对于想要精通iBatis的开发者来说是一份宝贵的资源。通过...

    ibatis工程依赖的jar包

    2. Statement和PreparedStatement:执行SQL语句,前者用于基本的SQL,后者支持预编译的SQL,提高性能并防止SQL注入。 3. ResultSet:存储查询结果,提供了遍历、获取数据的方法。 4. Connection和Statement的生命...

    ibatis实现数据的操作

    `#{}`是Ibatis的预编译参数占位符,能有效防止SQL注入。 在Java代码中,我们可以通过SqlSession的`selectOne`、`insert`、`update`和`delete`方法调用对应的Mapper接口方法,执行数据库操作。例如: ```java try ...

Global site tag (gtag.js) - Google Analytics