>백엔드 개발 >Golang >검증되지 않은 사용자 입력이 있는 PostgreSQL LIKE 표현식에서 리터럴 패턴 일치를 어떻게 달성할 수 있습니까?

검증되지 않은 사용자 입력이 있는 PostgreSQL LIKE 표현식에서 리터럴 패턴 일치를 어떻게 달성할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-21 05:00:12525검색

How Can I Achieve Literal Pattern Matching in PostgreSQL LIKE Expressions with Unvalidated User Input?

검증되지 않은 사용자 입력에 대한 PostgreSQL LIKE 표현식의 리터럴 패턴 일치

PostgreSQL의 LIKE 패턴에 대해 사용자 입력을 일치시킬 때 이스케이프가 필수입니다. 리터럴 일치를 보장하려면 "_" 및 "%"와 같은 특수 패턴 문자를 사용하세요. PostgreSQL에서는 이러한 문자를 백슬래시() 또는 ESCAPE 절로 정의된 사용자 정의 이스케이프 문자를 사용하여 인용해야 합니다.

예를 들어 "rob"을 문자 그대로 일치시키려면 밑줄 또는 문자가 포함된 사용자 입력을 이스케이프해야 합니다. 백분율 기호. 그러나 여기에는 잠재적인 함정이 있습니다. 사용자 입력에 백슬래시도 포함되어 있으면 백슬래시도 이스케이프해야 합니다. 이는 복잡해지고 버그로 이어질 수 있습니다.

서버측 솔루션

이를 우아하게 처리하려면 PostgreSQL의 replacement() 함수를 활용하여 특수 문자를 해당 문자로 바꿀 수 있습니다. 이스케이프 버전. 이 접근 방식에는 여러 가지 장점이 있습니다.

  • 서버에서 수행되므로 클라이언트측 처리가 필요하지 않습니다.
  • 필요한 모든 문자를 이스케이프하여 일관성을 보장합니다.
  • 사용자 입력에 밑줄, 퍼센트 기호 외에 특수 문자가 포함된 경우에도 원활하게 작동합니다.

예를 들어 문자 그대로 "rob"을 검색하려면 다음 쿼리를 사용할 수 있습니다.

SELECT * FROM users WHERE name LIKE replace(replace(replace(,'^','^^'),'%','^%'),'_','^_') ||'%' ESCAPE '^'

이 쿼리에서

  • $1은 사용자 입력에 대한 자리 표시자입니다.
  • replace($1,'^','^^')는 입력에서 캐럿 문자(^)를 이스케이프합니다. string.
  • replace(replace($1,'^','^^'),'%','^%')는 입력 문자열의 백분율 기호(%)를 이스케이프합니다.
  • replace(replace(replace($1,'^','^^'),'%','^%'),'_','^_') 는 밑줄(_)을 이스케이프합니다. 입력 문자열입니다.
  • ||'%'는 접두사 일치를 위해 검색 문자열에 후행 백분율 기호를 추가합니다.
  • ESCAPE '^'는 "^"를 이스케이프 문자로 지정하여 이스케이프할 수 있도록 합니다. 세 가지 특별한 것 중 하나

결론

서버측 대체 및 사용자 정의 이스케이프 문자를 사용하면 확인되지 않은 사용자 입력에 대해 PostgreSQL LIKE 표현식에서 리터럴 패턴 일치를 보장할 수 있습니다. . 이 접근 방식은 강력하고 주입 취약점을 방지하며 코드를 단순화합니다.

위 내용은 검증되지 않은 사용자 입력이 있는 PostgreSQL LIKE 표현식에서 리터럴 패턴 일치를 어떻게 달성할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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