Last active
September 4, 2023 08:07
-
-
Save steelywing/d3d53acc3c39f5208e74 to your computer and use it in GitHub Desktop.
ldap_escape() for PHP < 5.6
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Source: https://stackoverflow.com/a/8561604/1877620 | |
if (!function_exists('ldap_escape')) { | |
define('LDAP_ESCAPE_FILTER', 0x01); | |
define('LDAP_ESCAPE_DN', 0x02); | |
/** | |
* @param string $subject The subject string | |
* @param string $ignore Set of characters to leave untouched | |
* @param int $flags Any combination of LDAP_ESCAPE_* flags to indicate the | |
* set(s) of characters to escape. | |
* @return string | |
*/ | |
function ldap_escape($subject, $ignore = '', $flags = 0) | |
{ | |
static $charMaps = array( | |
LDAP_ESCAPE_FILTER => array('\\', '*', '(', ')', "\x00"), | |
LDAP_ESCAPE_DN => array('\\', ',', '=', '+', '<', '>', ';', '"', '#'), | |
); | |
// Pre-process the char maps on first call | |
if (!isset($charMaps[0])) { | |
$charMaps[0] = array(); | |
for ($i = 0; $i < 256; $i++) { | |
$charMaps[0][chr($i)] = sprintf('\\%02x', $i);; | |
} | |
for ($i = 0, $l = count($charMaps[LDAP_ESCAPE_FILTER]); $i < $l; $i++) { | |
$chr = $charMaps[LDAP_ESCAPE_FILTER][$i]; | |
unset($charMaps[LDAP_ESCAPE_FILTER][$i]); | |
$charMaps[LDAP_ESCAPE_FILTER][$chr] = $charMaps[0][$chr]; | |
} | |
for ($i = 0, $l = count($charMaps[LDAP_ESCAPE_DN]); $i < $l; $i++) { | |
$chr = $charMaps[LDAP_ESCAPE_DN][$i]; | |
unset($charMaps[LDAP_ESCAPE_DN][$i]); | |
$charMaps[LDAP_ESCAPE_DN][$chr] = $charMaps[0][$chr]; | |
} | |
} | |
// Create the base char map to escape | |
$flags = (int)$flags; | |
$charMap = array(); | |
if ($flags & LDAP_ESCAPE_FILTER) { | |
$charMap += $charMaps[LDAP_ESCAPE_FILTER]; | |
} | |
if ($flags & LDAP_ESCAPE_DN) { | |
$charMap += $charMaps[LDAP_ESCAPE_DN]; | |
} | |
if (!$charMap) { | |
$charMap = $charMaps[0]; | |
} | |
// Remove any chars to ignore from the list | |
$ignore = (string)$ignore; | |
for ($i = 0, $l = strlen($ignore); $i < $l; $i++) { | |
unset($charMap[$ignore[$i]]); | |
} | |
// Do the main replacement | |
$result = strtr($subject, $charMap); | |
// Encode leading/trailing spaces if LDAP_ESCAPE_DN is passed | |
if ($flags & LDAP_ESCAPE_DN) { | |
if ($result[0] === ' ') { | |
$result = '\\20' . substr($result, 1); | |
} | |
if ($result[strlen($result) - 1] === ' ') { | |
$result = substr($result, 0, -1) . '\\20'; | |
} | |
} | |
return $result; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment