MyBatis使用#和$操作符模拟sql注入

本文通过具体示例对比了MyBatis中#与$操作符在SQL注入防护上的区别,展示了#操作符如何有效防止SQL注入攻击,而$操作符则存在安全隐患。

一、接口方法:

    public interface PlayerDao {
        List<Player> findByName(@Param("playName") String playName);
    }
    
    Mapper文件1:
     <select id="findByName" resultType="Player">
            select *
            from tb_player
            where  playName = #{playName}
     </select>

    Mapper文件2:
      <select id="findByName" resultType="Player">
             select *
             from tb_player
             where  playName = '${playName}'
      </select>

二、测试代码

	关键代码如下:
    public void testSqlInject() {
            // 1.获取sqlSession
            SqlSession sqlSession = sqlSessionFactory.openSession();
            // 2.获取对应mapper
            PlayerDao mapper = sqlSession.getMapper(PlayerDao.class);
            String playName = "Lebron James";
            String fakeName = "Lebron Jamesxxx' or '1 = 1 ";
            //List<Player> list = mapper.findByName(playName);
            List<Player> list = mapper.findByName(fakeName);
            for (Player player: list) {
                System.out.println(player);
            }
            System.out.println(list.size());
        }

三、验证

验证#操作符

  • 使用Mapper文件1:
  • 执行testSqlInject,分别放开执行下面2行代码
    List<Player> list = mapper.findByName(playName);
    List<Player> list = mapper.findByName(fakeName);
    执行第一行,只能找到一条记录,
    执行第二行,不能找出任何记录,
    从而验证了#的防sql注入。

验证$操作符

  • 使用Mapper文件2
  • 执行testSqlInject,分别放开执行下面2行代码
    List<Player> list = mapper.findByName(playName);
    List<Player> list = mapper.findByName(fakeName);
    执行第一行,只能找到一条记录,
    执行第二行,可以找出数据库的全部记录,
    从而验证了$的sql注入的不安全性。

四、参考

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值