== How to fix it in Core PHP

=== Code examples

The following noncompliant code is vulnerable to LDAP injection because untrusted data is
concatenated to an LDAP query without prior sanitization or validation.

==== Noncompliant code example

[source,php,diff-id=1,diff-type=noncompliant]
----
$ldapconn = ldap_connect("localhost");

if($ldapconn){
  $user = $_GET["user"];

  $filter = "(&(objectClass=user)(uid=" . $user . "))";
  $dn = "dc=example,dc=org";

  ldap_list($ldapconn, $dn, $filter); // Noncompliant
}
----

==== Compliant solution

[source,php,diff-id=1,diff-type=compliant]
----
$ldapconn = ldap_connect("localhost");

if($ldapconn){
  $user = $ldap_escape($_GET["user"], "", LDAP_ESCAPE_FILTER);
  
  $filter = "(&(objectClass=user)(uid=" . $user . "))";
  $dn = "dc=example,dc=org";
  
  ldap_list($ldapconn, $dn, $filter);
}
----

=== How does this work?

include::../../common/fix/validation.adoc[]

For PHP, the core library function
https://www.php.net/manual/en/function.ldap-escape.php[`ldap_escape`] allows sanitizing these characters.

In the compliant solution example, the `ldap_escape` function is used with the
`LDAP_ESCAPE_FILTER` flag, which sanitizes potentially malicious characters in the search filter.
The function can also be used with the `LDAP_ESCAPE_DN` flag, which sanitizes
the distinguished name (DN).
