개발/개발관련

[개발관련] inteliJ 정규표현식 일괄 수정 방법_ 마이바티스 인젝션 조치 중

mabb 2023. 12. 19. 12:34
반응형

내용1) InteliJ 프로젝트 내 일괄 바꾸기 :  Ctrl + Shift + R
내용2) 정규표현식 활성화 아이콘 클릭 :  .*
내용3) 바꿀 문자열을 찾는 정규표현식에서 사용하는 소괄호 ( () )  는 $1, $2 등으로 바꾼 후 문자열에서 변수로 사용 가능

----------------------------------------------------------------------------

마이바티스 인젝션 조치를  해야 하는 상황이 생겼다.
기존 소스에서 마이바티스 파라미터 세팅시 보안에 취약한 '$'를 사용하여 보안체커에 걸리게 되었는데
그 건수가 약 70건에 달했다.

'$' 를 '#'으로 변경하는 경우 간단하게 InteliJ에서 Ctrl + Shift + R 로 일괄 바꾸기를 하면 되지만 기존에 '$'를 사용한 패턴이 다음과 같았다.

AND USER_ID LIKE '%${USER_ID}%'

LIKE 문을 사용하면서 '%'와 함께 사용하기 위해 위와 같이 작성을 한 것 같다.
해당 내용을 다음과 같이 변경하고자 하였다.

AND USER_ID LIKE '%' || #{USER_ID} || '%'


LIKE 이하  '%${USER_ID}%' 부분만 바꾸기로 생각하고 ChatGPT에 한 번에  일괄적으로 변경할 수 있을 지 문의 하였다.

출처: ChatGPT

 

테스트를 위해 inteliJ 프로젝트 내 아무 경로에 file을 하나 만들고 테스트용 문자열을 붙여 넣었다.

바꾸기 테스트용 test파일


Ctrl+R 로 바꾸기 기능을 켜고 정규표현식 (.*)을 활성화 한 후
ChatGPT가 만들어준 정규식을 붙여넣었으나 Bad pattern이라는 문구가 나온다.


어떤 패턴에서 인식을 하지 못하는지 다시 작성을 해보았다. inteliJ에서는 아래와 같이 즉각적으로 정규식으로 찾는 패턴을 하이라이트 처리해주기 때문에 정규식을 올바르게 작성하고 있는지 바로 확인할 수 있다.


'$'에서 막히므로 '\' 이스케이프 문자를 추가해주었다. 마찬가지로 막히는 부분에서 이스케이프 문자를 추가한다.

 

 

바꾸기 전 문자열에서 중괄호({}) 사이의 USER_ID는 바꾼 후의 문자열에도 그대로 들어가 주어야 한다. 그렇다고 바꿀 문자열에 'USER_ID' 라고 그대로 적어버리면 'USER_NAME" 이나 'USER_PHONE' 도 모두 'USER_ID' 로 바뀌어 버린다. InteliJ에는 정규표현식 내에 소괄호( () ) 로 감싼 부분을 바꿀 문자열에서 변수로 사용할 수 있는 기능을 제공한다.  JDBC 에서prepareStatement로 Insert 할 파라미터를 세팅할 때 ?,?,?,?  를 순서대로 1,2,3,4 로 처리하듯 정규표현식에서 변수로 사용할 소괄호( () ) 는 순서대로 $1, $2, $3 등의 변수로 사용할 수 있다.


최종적으로 다음과 같은 정규식을 입력했을 때 

'%\$\{(.*?)\}%'

아래의 패턴들을 제대로 인식할 수 있었다.

'%${USER_ID}%'

'%${USER_NAME}%'

'%${USER_PHONE}%'

바꿀 패턴은 다음과 같이 ChatGPT가 알려준 그대로 사용하였다.

'%' || #{$1} || '%



Replace All 버튼을 누르면 아래와 같이  수정이 완료된다.

'%' || #{USER_ID} || '%'

'%' || #{USER_NAME} || '%'

'%' || #{USER_PHONE} || '%'


한 편,  문자열 바꾸기 정규표현식에서 소괄호로 감싼 부분을 변수로 인식하는 부분을 다음과 같이 테스트 해보았다.
정규식에서 사용한 소괄호는 순서대로 $1, $2에 매핑된다.

변경 전 문자를 찾는 정규식 : \'%\$\{(.*?)\}%\'


변경 후 문자 세팅 : '%' || #{$1} || '%'

 

 

반응형