안녕하세요 전자정부fw에 ibatis dynamic sql 을 사용중인 프로젝트 입니다.
selct s.*
from (
<include refie ="selectEventboard"/>
where userid = #userid#
<dynamic>
<isNotEqual> property ="field" compareValue ="all">
$field$ like '%' #keword# || '%'
</inNotEqual>
</dynamic>
//소스일부분인입니다.
질문은 $field$ 이부분에서 정적SW진단도구를 수행하니 SQL INJECTION이라고 잡혔습니다.
수정을 하라고 지적을 하였으나 IBATIS 문장에서 $를 사용이 Dynamic Sql 사용을 위하여 수정이 불가능하다라고 개발자한테 답변을 받았습니다.
제가 DB쪽 문법을 몰라 이렇게 질문을 하게 되었습니다.
$field$ -> #field#로 수정을 하면 안되는건가요?(preparedStatement 하게 )
값은 #으로 하여 바인드 변수 처리 하는게 맞습니다만...
값이 아닌 테이블명, 컬럼명, 명령어 등은 # 처리가 불가합니다.
# 으로 처리하면 컬럼명으로 인식하지 못하고 그냥 문자열로만 인식하게 됩니다.
예를 들어 field = 'ename' 이고 keyword = 'SCOTT' 로 입력되었을 때
$ 를 사용한 조건은 WHERE ename = 'SCOTT' 로 처리되는데
# 를 사용한 조건은 WHERE 'ename' = 'SCOTT' 로 처리됩니다.
field 항목의 종류는 몇가지로 제한되어 있을 것입니다.
field + keyword 조합으로 처리하기 보다는
field 항목별 각각의 변수를 사용하는 방식으로 변경하면 될 것 같네요.
감사합니다.
전체 쿼리로 올려주세요.
DYNAMIC SQL 안쓰고 해결할수있을지는 봐야 알것같습니다.
감사합니다.
각각의 컬럼변수를 사용하는 방식으로 적용되어 있고 <isNotEqual property = 'field
compareValue = 'a''> 경우에만 $field$ like '%' #keword# || '%' 되어 있습니다.
DECODE(#field#,'field1', field1,'field2',field2,'field3','field3' .... ) like '%' #keword# || '%'
이렇게 처리할수도 있을것같은데 성능을 기대하긴 좀 힘들것 같습니다.