>Java >java지도 시간 >JAVA의 Mybatis에서 SQL 주입을 방지하는 방법

JAVA의 Mybatis에서 SQL 주입을 방지하는 방법

怪我咯
怪我咯원래의
2017-06-30 10:50:301361검색

이 글은 SQL 인젝션을 방지하기 위한 마이바티스의 관련 정보를 소개하고 있습니다. 매우 훌륭하고 참고할만한 가치가 있습니다. 필요하신 분들은 참고하시면 됩니다.

SQL 인젝션은 공격자에게 흔한 공격 방법입니다. "또는 '1'='1'"과 같은 문과 같은 이상한 SQL 조각을 인터페이스의 양식 정보 또는 URL에 입력하면 매개변수 확인이 충분하지 않은 응용 프로그램에 침입할 수 있습니다. 따라서 이러한 공격을 방지하려면 애플리케이션에서 몇 가지 작업을 수행해야 합니다. 뱅킹 소프트웨어와 같은 일부 안전한응용 프로그램에서는 SQL 삽입을 방지하기 위해 모든 SQL 문을 저장 프로시저로 바꾸는 데 자주 사용됩니다. 이는 물론 매우 안전한 방법이지만 일반적으로 개발 중에는 이러한 엄격한 접근 방식이 사용될 수 있습니다. 필요하지 않습니다.

mybatisFramework 반자동 영속성 계층 프레임워크이므로 sql 문을 직접 작성해야 합니다. 물론 이때 sql 주입을 방지해야 합니다. 실제로 마이바티스의 sql은 function과 유사하게 "입력 + 출력" 함수를 갖는 구조로 다음과 같습니다.

<select id="getBlogById" resultType="Blog" parameterType=”int”>
  select id,title,author,content
  from blog where id=#{id}
 </select>

여기서, paramatorType은 입력 매개변수 유형을 나타내고, resultType은 출력 매개변수 유형을 나타냅니다. 위의 내용에 대해 SQL 인젝션을 방지하려면 입력 매개변수에 대해 열심히 노력하는 것이 당연합니다. 위 코드에서 강조표시된 부분은 sql에서 입력 매개변수를 이어붙인 부분입니다. 매개변수를 전달한 후 실행된 sql 문을 출력해 보면 다음과 같은 sql이 나오는 것을 볼 수 있습니다.

select id,title,author,content from blog where id = ?

상관없습니다. 어떤 매개변수가 입력되면 인쇄된 SQL은 다음과 같습니다. 이는 mybatis가 사전 컴파일 기능을 활성화했기 때문입니다. sql이 실행되기 전에 위의 sql이 컴파일을 위해 데이터베이스로 전송됩니다. 실행 중에 컴파일된 sql이 직접 사용되며 자리 표시자 "?"가 대체됩니다. SQL 주입은 컴파일 과정에서만 작동하므로 이 방법을 사용하면 SQL 주입 문제를 피할 수 있습니다.

mybatis는 어떻게 SQL 사전 컴파일을 달성하나요? 실제로 프레임워크의 맨 아래에는 jdbc의 ReadyStatement 클래스가 작동하고 있으며, 이 클래스의 객체 에는 컴파일된 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, 작성자, content from blog order by id

분명히 이것이 sql을 막을 수는 없습니다. 주입. mybatis에서는 "${xxx}" 형식의 매개변수가 SQL 컴파일에 직접 참여하므로 주입 공격을 피할 수 없습니다. 그러나 동적 테이블 이름과 열 이름의 경우 "${xxx}"와 같은 매개변수 형식만 사용할 수 있으므로 이러한 매개변수는 삽입을 방지하기 위해 코드에서 수동으로 처리해야 합니다.

결론: mybatis의 매핑문을 작성할 때 "#{xxx}" 형식을 사용해 보세요. "${xxx}"와 같은 매개변수를 사용해야 하는 경우 SQL 주입 공격을 방지하려면 매개변수를 수동으로 필터링해야 합니다.

위 내용은 JAVA의 Mybatis에서 SQL 주입을 방지하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.