MyBatis使用#和$操作符模拟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注入的不安全性。

四、参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值