2018년 3월 26일 월요일

Elasticsearch에서 정규표현식 검색

엘라스틱서치는 정규표현식 검색도 지원한다. 그런데 결론부터 얘기하면 '\'를 이용한 이스케이프 메타문자는 지원하지 않는다. 다음은 '1=1' 형식의 문자열을 검사하는 정규표현식 검색어 'var.keyword:*%20and%20* AND var_decode.keyword:/.*\d+=\d+.*/'의 검색 결과.


이스케이프 메타문자 '\d(숫자 검사)'를 문자클래스 형식([0-9])으로 바꿔주면 검색이 된다. 정규표현식을 완벽하게 지원하지는 않는 듯.


Sql 인젝션 유형의 문자열 패턴 검색이 목적이라, 인용부호가 존재하는 경우도 검사할 수 있도록 검색어를 수정해봤다. (var_decode.keyword:/.*('|")?[0-9]+('|")?=('|")?[0-9]+.*/)


안 되네?


혹시나 싶어 인용부호 OR 연산 표현식 '('|")'을 문자클래스 형식(['"])으로 바꿔봤다.


잘 됨(..)


마지막 테스트. 다음은 인용부호가 포함된 경우만을 검색하도록 수량자 '?'를 없앤 결과.


인용부호 OR 연산 표현식 '['"]'을 하나 더 추가하면 검색은 실패한다. ''1'='1' 형식은 존재하지만, ''1'='1'' 형식의 문자열 패턴은 없기 때문. (var_decode.keyword:/.*['"][0-9]+['"]=['"][0-9]+['"].*/)


그런데 캡쳐그룹을 이용한 OR 연산 표현식을 사용하면 ''1'='1'' 형식이 없음에도 검색이 된다. (var_decode.keyword:/.*('|")[0-9]+('|")=('|")[0-9]+('|").*/)



정규표현식 검사에서도 특수문자가 포함되면 뭔가 좀 이상하게 동작하는 느낌. 아니면 정규표현식 지원이 완벽하지 않아서 그런가?

댓글 없음:

댓글 쓰기

크리에이티브 커먼즈 라이선스