mybatis의 #과 $의 차이 및 sql 주입 방지 방법

mybatis의 #과 $의 차이
1. # 전송된 데이터를 문자열로 간주하면 자동으로 전송된 데이터에 이중 따옴표가 붙습니다.예: order by #user_id#, 전송된 값이 111이면 sql로 해석될 때의 값은order by'111'이고, 전송된 값이 id이면 sql이order by'id'로 해석됩니다.
  
2. $는 전송된 데이터를 sql에 직접 표시합니다.예: order by $user_id$, 전송된 값이 111이면 sql로 해석된 값은order by user_id, 만약 전송된 값이 id라면, 해석된 sql은order by id입니다.
  
3. # 방식은 sql 주입을 어느 정도 방지할 수 있다.
  
4.$방식으로는 Sql 주입을 방지할 수 없습니다.
5.$방식은 일반적으로 데이터베이스 대상(예를 들어 테이블 이름)을 전송하는 데 사용된다.
  
6. 보통 #을 쓸 수 있는 것은 $를 쓰지 마세요.
Sql 주입 방지
참고: SQL 문장은 select * from t_로 작성하지 마십시오.stu where s_name like'%$name$%', 주입 공격을 받기 쉽습니다.
"${xxx}"형식의 매개 변수는 sql 컴파일에 직접 참여하여 주입 공격을 피할 수 없습니다.그러나 동적 테이블 이름과 열 이름이 관련될 때'${xxx}'와 같은 매개 변수 형식만 사용할 수 있습니다.
mybatis의 맵 문장을 작성할 때 가능한 한 "#{xxx}"형식을 사용하십시오."${xxx}"같은 매개 변수를 사용해야 한다면, sql 주입 공격을 방지하기 위해 수동으로 필터 작업을 해야 합니다.
예제

<sql id="condition_where">  
  <isNotEmpty property="companyName" prepend=" and ">  
    t1.company_name like #companyName#  
  </isNotEmpty>  
</sql> 
자바 코드는 당신과 원래의 차이가 많지 않습니다. 사실 나쁠 것도 없습니다. null과'%'를 판단하는 방법을 봉인하면 됩니다.

if (!StringUtil.isEmpty(this.companyName)) {  
  table.setCompanyName("%" + this.companyName + "%");  
} 
다음은 mybatis의 #와 $의 차이점, sql 주입을 방지하는 방법에 대한 간단한 이야기입니다. 많은 응원 부탁드립니다~

좋은 웹페이지 즐겨찾기