On 20 Jul 2011, at 10:02, Clément OUDOT wrote: > Hi, > > I have a piece of code where I build a search filter with some > variables, like this: > > my $searchFilter = > "(&(objectClass=" . $portal->{ldapGroupObjectClass} . ")(|"; > foreach ( split( $portal->{multiValuesSeparator}, $value ) ) { > $searchFilter .= "(" . $key . "=" . $_ . ")"; > } > $searchFilter .= "))"; > > This works well, excepted when the value (in the key=value syntax) > contains a backslash ('\'). This is the case for example if the value > is a DN like this : cn=OUDOT\, Clement, ou=users, dc=example, dc=com > > To make this works, I added this line : > > $searchFilter =~ s/\\/\\\\/; > > > My question: is this a bug in my code, or can this be a Perl-LDAP bug? > I am using version 0.4001.
I think it is a bug in your code :-( LDAP search filter strings consider certain characters as "special" when used in assertion values, so there is an escape mechanism defined - which is to use backslash and the hex-encoding of the character (eg \xx) or backslash and a single character (eg \c). So your $_ value needs to be escaped correctly before inserting it into an LDAP filter string. You need to escape more than backslashes - what if your input value was ")"? Doing a subsequent regexp replace of \ to \\ is not really robust. RFC 4515 should list all the characters that you have to escape. Actually, the Net::LDAP::Filter documentation lists them as well :-) You could also consider building your filter using Net::LDAP::Filter instead of as a string. Chris