3. 文字列検索フィルタの定義
LDAP 検索フィルタの文字列表現は、以下の文法によって定義される UTF-8 [RFC3629] エンコードされた Unicode 文字 [Unicode] の文字列であり、[RFC4234] で定義されている ABNF 表記に従います。ここで定義されていない生成規則は、特に明記されていない限り、[RFC4512] のセクション 1.4 (共通 ABNF 生成規則) で定義されています。フィルタ形式はプレフィックス表記を使用します。
filter = LPAREN filtercomp RPAREN
filtercomp = and / or / not / item
and = AMPERSAND filterlist
or = VERTBAR filterlist
not = EXCLAMATION filter
filterlist = 1*filter
item = simple / present / substring / extensible
simple = attr filtertype assertionvalue
filtertype = equal / approx / greaterorequal / lessorequal
equal = EQUALS
approx = TILDE EQUALS
greaterorequal = RANGLE EQUALS
lessorequal = LANGLE EQUALS
extensible = ( attr [dnattrs]
[matchingrule] COLON EQUALS assertionvalue )
/ ( [dnattrs]
matchingrule COLON EQUALS assertionvalue )
present = attr EQUALS ASTERISK
substring = attr EQUALS [initial] any [final]
initial = assertionvalue
any = ASTERISK *(assertionvalue ASTERISK)
final = assertionvalue
attr = attributedescription
; The attributedescription rule is defined in
; Section 2.5 of [RFC4512].
dnattrs = COLON "dn"
matchingrule = COLON oid
assertionvalue = valueencoding
; The <valueencoding> rule is used to encode an <AssertionValue>
; from Section 4.1.6 of [RFC4511].
valueencoding = 0*(normal / escaped)
normal = UTF1SUBSET / UTFMB
escaped = ESC HEX HEX
UTF1SUBSET = %x01-27 / %x2B-5B / %x5D-7F
; UTF1SUBSET excludes 0x00 (NUL), LPAREN,
; RPAREN, ASTERISK, and ESC.
EXCLAMATION = %x21 ; exclamation mark ("!")
AMPERSAND = %x26 ; ampersand (or AND symbol) ("&")
ASTERISK = %x2A ; asterisk ("*")
COLON = %x3A ; colon (":")
VERTBAR = %x7C ; vertical bar (or pipe) ("|")
TILDE = %x7E ; tilde ("~")
上記の文法では <substring> と <present> の両方の生成規則が "attr=*" 構造を生成できますが、この構造は存在フィルタを示すためにのみ使用されることに注意してください。
<valueencoding> 規則は、フィルタ文字列全体が有効な UTF-8 文字列であることを保証し、ASCII 文字 "*" (ASCII 0x2a)、"(" (ASCII 0x28)、")" (ASCII 0x29)、"" (ASCII 0x5c)、および NUL (ASCII 0x00) を表すオクテットが、バックスラッシュ "" (ASCII 0x5c) とそれに続くエンコードされたオクテットの値を表す 2 つの 16 進数字として表現されることを規定します。
この単純なエスケープメカニズムにより、フィルタ解析の曖昧さが排除され、LDAP で表現できる任意のフィルタを NUL 終端文字列として表現できるようになります。<normal> セットの一部である他のオクテットも、このメカニズムを使用してエスケープできます (例: 非表示 ASCII 文字)。
UTF-8 文字データを含む AssertionValues の場合、エスケープされる文字の各オクテットは、バックスラッシュと 2 つの 16 進数字に置き換えられます。これらは、文字のコード内の単一のオクテットを形成します。たとえば、"cn" 属性に文字 "" を含む値が含まれているかどうかを確認するフィルタは、"(cn=\2a*)" と表現されます。
<valueencoding> 規則で示されているように、実装は、検索フィルタの文字列表現を生成するときに、有効な UTF-8 エンコードシーケンスの一部ではない 0x7F より大きいすべてのオクテットをエスケープしなければなりません (MUST)。実装は、有効な UTF-8 文字列ではない入力文字列を受け入れるべきです (SHOULD)。これは、RFC 2254 が「文字列表現」という用語を明確に定義していなかったためです (特に、LDAP 検索フィルタの文字列表現が UTF-8 エンコードされた Unicode 文字の文字列であることについて言及していませんでした)。