CGI-IDS
view release on metacpan or search on metacpan
lib/CGI/IDS.pm view on Meta::CPAN
#****if* IDS/_convert_from_control_chars
# NAME
# _convert_from_control_chars
# DESCRIPTION
# Detects nullbytes and controls chars via ord()
# INPUT
# value the string to convert
# OUTPUT
# value converted string
# SYNOPSIS
# IDS::_convert_from_control_chars($value);
#****
sub _convert_from_control_chars {
my ($value) = @_;
# critical ctrl values
my @search = (
chr(0), chr(1), chr(2), chr(3), chr(4), chr(5),
chr(6), chr(7), chr(8), chr(11), chr(12), chr(14),
chr(15), chr(16), chr(17), chr(18), chr(19), chr(24),
chr(25), chr(192), chr(193), chr(238), chr(255)
);
$value = str_replace(\@search, '%00', $value);
# take care for malicious unicode characters
$value = urldecode(preg_replace(qr/(?:%E(?:2|3)%8(?:0|1)%(?:A|8|9)\w|%EF%BB%BF|%EF%BF%BD)|(?:&#(?:65|8)\d{3};?)/i, '',
urlencode($value)));
$value = urldecode(
preg_replace(qr/(?:%F0%80%BE)/i, '>', urlencode($value)));
$value = urldecode(
preg_replace(qr/(?:%F0%80%BC)/i, '<', urlencode($value)));
$value = urldecode(
preg_replace(qr/(?:%F0%80%A2)/i, '"', urlencode($value)));
$value = urldecode(
preg_replace(qr/(?:%F0%80%A7)/i, '\'', urlencode($value)));
$value = preg_replace(qr/(?:%ff1c)/, '<', $value);
$value = preg_replace(
qr/(?:&[#x]*(200|820|200|820|zwn?j|lrm|rlm)\w?;?)/i, '', $value
);
$value = preg_replace(qr/(?:&#(?:65|8)\d{3};?)|(?:&#(?:56|7)3\d{2};?)|(?:&#x(?:fe|20)\w{2};?)|(?:&#x(?:d[c-f])\w{2};?)/i, '',
$value);
$value = str_replace(
["\x{ab}", "\x{3008}", "\x{ff1c}", "\x{2039}", "\x{2329}", "\x{27e8}"], '<', $value
);
$value = str_replace(
["\x{bb}", "\x{3009}", "\x{ff1e}", "\x{203a}", "\x{232a}", "\x{27e9}"], '>', $value
);
return $value;
}
#****if* IDS/_convert_from_nested_base64
# NAME
# _convert_from_nested_base64
# DESCRIPTION
# Matches and translates base64 strings and fragments used in data URIs (use MIME::Base64;)
# INPUT
# value the string to convert
# OUTPUT
# value converted string
# SYNOPSIS
# IDS::_convert_from_nested_base64($value);
#****
sub _convert_from_nested_base64 {
my ($value) = @_;
my @matches = ();
preg_match_all(qr/(?:^|[,&?])\s*([a-z0-9]{30,}=*)(?:\W|$)/im, #)/
$value,
\@matches,
);
# PHP to Perl note: PHP's $matches[1] is Perl's default ($matches[0] is the entire RegEx match)
foreach my $item (@matches) {
if ($item && !preg_match(qr/[a-f0-9]{32}/i, $item)) {
# fill up the string with zero bytes if too short for base64 blocks
my $item_original = $item;
if (my $missing_bytes = length($item) % 4) {
for (1..$missing_bytes) {
$item .= "=";
}
}
my $base64_item = MIME::Base64::decode_base64($item);
$value = str_replace($item_original, $base64_item, $value);
}
}
return $value;
}
#****if* IDS/_convert_from_out_of_range_chars
# NAME
# _convert_from_out_of_range_chars
# DESCRIPTION
# Detects nullbytes and controls chars via ord()
# INPUT
# value the string to convert
# OUTPUT
# value converted string
# SYNOPSIS
# IDS::_convert_from_out_of_range_chars($value);
#****
sub _convert_from_out_of_range_chars {
my ($value) = @_;
my @values = str_split($value);
foreach my $item (@values) {
if (ord($item) >= 127) {
$value = str_replace($item, ' ', $value);
}
}
return $value;
( run in 1.566 second using v1.01-cache-2.11-cpan-b16cb0d3907 )