Another difference is that upstream 2.6.9 used a replacement character
of underscore rather than a dot. Attached is my suggested revision of
Salvatore's patch (also adds filtering of time specifiers).
I've tested this on an existing wheezy/sid SmokePing installation; it
stops the injection of quotes into the <img> tag I demonstrated before.
It also prevents those characters from being used in graph filenames in
the cache directory. I've tried some valid time specifiers and they are
still working.
Regards,
--
Steven Chamberlain
[email protected]
Index: smokeping-2.6.8/lib/Smokeping.pm
===================================================================
--- smokeping-2.6.8.orig/lib/Smokeping.pm 2012-02-26 18:19:45.000000000 +0000
+++ smokeping-2.6.8/lib/Smokeping.pm 2013-03-16 23:07:00.000000000 +0000
@@ -28,6 +28,8 @@
# make sure we do not end up with , in odd places where one would expect a '.'
# we set the environment variable so that our 'kids' get the benefit too
+my $xssBadRx = qr/[<>%&'";]/;
+
$ENV{'LC_NUMERIC'}='C';
if (setlocale(LC_NUMERIC,"") ne "C") {
if ($ENV{'LC_ALL'} eq 'C') {
@@ -170,7 +172,7 @@
my $hierarchy = '';
my $h = $q->param('hierarchy');
if ($q->param('hierarchy')){
- $h =~ s/[<>&%]/./g;
+ $h =~ s/$xssBadRx/_/g;
$hierarchy = 'hierarchy='.$h.';';
};
return $hierarchy;
@@ -212,7 +214,7 @@
my $address = $ENV{REMOTE_ADDR};
my $targetptr = $cfg->{Targets};
foreach my $step (@target){
- $step =~ s/[<>&%]/./g;
+ $step =~ s/$xssBadRx/_/g;
return "Error: Unknown target $step"
unless defined $targetptr->{$step};
$targetptr = $targetptr->{$step};
@@ -1024,6 +1026,7 @@
sub parse_datetime($){
my $in = shift;
for ($in){
+ $in =~ s/$xssBadRx/_/g;
/^(\d+)$/ && do { my $value = $1; $value = time if $value > 2**32; return $value};
/^\s*(\d{4})-(\d{1,2})-(\d{1,2})(?:\s+(\d{1,2}):(\d{2})(?::(\d{2}))?)?\s*$/ &&
return POSIX::mktime($6||0,$5||0,$4||0,$3,$2-1,$1-1900,0,0,-1);
@@ -1047,7 +1050,7 @@
my $tree = shift;
my $open = shift;
my $mode = shift || $q->param('displaymode') || 's';
- $mode =~ s/[<>&%]/./g;
+ $mode =~ s/$xssBadRx/_/g;
my $phys_tree = $tree;
my $phys_open = $open;
if ($tree->{__tree_link}){
@@ -1447,7 +1450,7 @@
$startstr =~ s/\s/%20/g;
$endstr =~ s/\s/%20/g;
my $t = $q->param('target');
- $t =~ s/[<>&%]/./g;
+ $t =~ s/$xssBadRx/_/g;
for my $slave (@slaves){
my $s = $slave ? "~$slave" : "";
$page .= "<div>";
@@ -1601,7 +1604,7 @@
my $t = $q->param('target');
if ( $t and $t !~ /\.\./ and $t =~ /(\S+)/){
$targ = $1;
- $targ =~ s/[<>;%]/./g;
+ $targ =~ s/$xssBadRx/_/g;
}
my ($path,$slave) = split(/~/,$targ);
if ($slave and $slave =~ /(\S+)/){
@@ -1610,7 +1613,7 @@
$slave = $1;
}
my $hierarchy = $q->param('hierarchy');
- $hierarchy =~ s/[<>;%]/./g;
+ $hierarchy =~ s/$xssBadRx/_/g;
die "ERROR: unknown hierarchy $hierarchy\n"
if $hierarchy and not $cfg->{Presentation}{hierarchies}{$hierarchy};
my $open = [ (split /\./,$path||'') ];