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]+('|").*/)


정규표현식 검사에서도 특수문자가 포함되면 뭔가 좀 이상하게 동작하는 느낌.

관련 글

댓글 없음:

댓글 쓰기

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