java 지구층 프레임워크 mybatis sql 주입 방지 방법
mybatis 프레임워크는 반자동화된 지구층 프레임워크로서 그 sql 문장은 우리가 수동으로 작성해야 한다. 이럴 때 당연히 sql 주입을 방지해야 한다.사실 Mybatis의 sql은'입력+출력'기능을 가지고 함수와 유사한 구조로 다음과 같다.
<select id=“getBlogById“ resultType=“Blog“ parameterType=”int”><br>
select id,title,author,content from blog where id=#{id}
</select>
여기,parameterType은 입력한 매개 변수 형식을 표시하고,resultType은 출력된 매개 변수 형식을 표시합니다.위의 문장에 응답합니다. 만약 우리가 sql 주입을 방지하려면 당연히 매개 변수를 입력하는 데 힘을 써야 합니다.위 코드의 하이라이트 부분은 바로 매개 변수가 sql에서 연결된 부분을 입력하여 매개 변수를 전송한 후 실행된 sql 문장을 출력하면 sql가 이렇다는 것을 볼 수 있습니다.
select id,title,author,content from blog where id = ?
어떤 파라미터를 입력하든지 간에 인쇄된 sql은 모두 이렇다.이것은 mybatis가 사전 컴파일링 기능을 사용하기 때문에 sql가 실행되기 전에 위의 sql를 데이터베이스에 전송하여 컴파일합니다. 실행할 때 직접 컴파일된 sql를 사용하여 자리 차지 문자'?'를 대체합니다.됐어.sql 주입은 번역 과정에만 작용할 수 있기 때문에 이런 방식은 sql 주입 문제를 잘 피할 수 있다.mybatis는 어떻게 sql를 미리 컴파일합니까?사실 프레임워크 밑에 jdbc의 PreparedStatement 클래스가 작용하고 있습니다. PreparedStatement는 우리가 잘 알고 있는 Statement의 하위 클래스입니다. 그 대상은 번역된 sql 문장을 포함합니다.이런'준비'방식은 안전성을 높일 수 있을 뿐만 아니라 여러 번 sql를 실행할 때 효율을 높일 수 있다. 왜냐하면 sql가 이미 컴파일되었기 때문에 다시 실행할 때 다시 컴파일할 필요가 없기 때문이다.
그나저나 우리가 mybatis를 사용하면 반드시 sql 주입을 방지할 수 있습니까?물론 아닙니다. 아래 코드를 보십시오.
<select id=“orderBlog“ resultType=“Blog“ parameterType=”map”>
select id,title,author,content from blog order by ${orderParam}
</select>
자세히 살펴보면 내연 매개변수의 형식이 "#{xxx}"에서 ${xxx} 로 변경됩니다.만약 우리가 파라미터 "orderParam"에 "id"를 부여하면 sql를 출력합니다.
select id,title,author,content from blog order by id
분명히 이것은 ql 주입을 막을 수 없습니다.mybatis에서 "${xxx}"형식의 매개 변수는 sql 컴파일에 직접 참여하여 주입 공격을 피할 수 없습니다.그러나 동적 테이블 이름과 열 이름이 관련될 때'${xxx}'라는 매개 변수 형식만 사용할 수 있기 때문에, 이러한 매개 변수는 코드에서 수동으로 처리하여 주입을 방지해야 합니다.결론: mybatis의 맵 문장을 작성할 때 가능한 한 "#{xxx}"형식을 사용합니다."${xxx}"같은 매개 변수를 사용해야 한다면, sql 주입 공격을 방지하기 위해 수동으로 필터 작업을 해야 합니다.
지금까지 여러분에게 가져온 자바 지구층 프레임워크 mybatis sql 주입 방지 방법의 모든 내용입니다. 많은 응원 부탁드립니다~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MySQL/마이바티스 | 동적 쿼리 사용A라는 서비스에 해당하는 테이블을 조인하고 조회하는 데 사용됩니다. 나중에 공통화를 위해 B 및 C 서비스도 추가됩니다. A, B, C 서비스는 모두 단일 쿼리에서 작동할 수 있도록 공통화되어야 합니다. 테이블에 각...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.