mybatis에서 #과 $의 차이
1. # 모든 들어오는 데이터를 문자열로 처리하고 자동으로 들어오는 데이터에 이중 인용문을 추가하십시오. 예를 들면 : #user_id #의 주문, 전달 된 값이 111 인 경우 SQL로 구문 분석 할 때의 값은 "111"으로 주문됩니다. 통과 된 값이 ID 인 경우 SQL로 구문 분석 된 것은 "id"로 주문됩니다.
2. $ 전달 된 데이터를 직접 표시하고 SQL로 생성합니다. 예를 들면 다음과 같습니다. $ user_id $로 주문하십시오. 전달 된 값이 ID 인 경우 SQL로 구문 분석 된 것은 ID로 주문됩니다.
3. # 메소드는 SQL 주입을 크게 방지 할 수 있습니다.
4. $ 방법은 SQL 주입을 방지 할 수 없습니다.
5. $ 메소드는 일반적으로 테이블 이름을 전달하는 것과 같은 데이터베이스 개체를 전달하는 데 사용됩니다.
6. 일반적으로 #을 사용할 수있는 경우 $를 사용하지 마십시오.
SQL 주입을 방지하십시오
참고 : SQL 문을 SELECT * FROM T_STU에서 '%$ name $%'와 같은 s_name에서 삭제하지 마십시오. 이는 주입 공격에 매우 취약합니다.
"$ {xxx}"형식의 매개 변수는 SQL 컴파일에 직접 참여하여 주입 공격을 방지합니다. 그러나 동적 테이블 이름과 열 이름과 관련하여 "$ {xxx}"와 같은 매개 변수 형식 만 사용할 수 있습니다.
mybatis 매핑 명령문을 작성할 때 "#{xxx}"형식을 사용하십시오. "$ {xxx}"와 같은 매개 변수를 사용해야하는 경우 SQL 주입 공격을 방지하기 위해 수동으로 필터링을 잘 수행해야합니다.
예
<sql id = "condition_where"> <isnotempty property = "CompanyName"prepend = "및"> t1.company_name wark # companyname # </isnotempty> </sql>
Java 코드는 원래 코드와 유사하지만 아무런 문제가 없습니다. 판단 null과 '%'를 하나의 방법으로 캡슐화하는 것이 번거 롭다 고 생각한다면.
if (! stringUtil.isempty (this.companyname)) {table.setcompanyname ( "%" + this.companyname + "%"); }위의 것은 mybatis의 #과 $의 차이와 SQL 주입을 방지하는 방법에 대한 간단한 논의입니다. 모두가 wulin.com을 더 지원하기를 바랍니다