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

Reply via email to