',
+ 'multiple modern event handlers are disabled',
+);
+
+is(
+ main::filter_javascript(
+ '
link'),
+ '
link',
+ 'non-handler attributes are preserved while script URIs are disabled',
+);
+
+done_testing();
diff --git a/web-lib-funcs.pl b/web-lib-funcs.pl
index cb11e08f8..920949c74 100755
--- a/web-lib-funcs.pl
+++ b/web-lib-funcs.pl
@@ -5741,6 +5741,16 @@ if ($module_name) {
$module_root_directory = &module_root_directory($module_name);
}
+if (!$main::allow_rpc_only &&
+ $main::webmin_script_type eq 'web' &&
+ !$main::no_acl_check &&
+ !defined($ENV{'FOREIGN_MODULE_NAME'})) {
+ # Check if this user is RPC-only
+ if (&webmin_user_can_rpc() == 2) {
+ &error($text{'erpconly'});
+ }
+ }
+
if ($module_name && !$main::no_acl_check &&
(!defined($ENV{'FOREIGN_MODULE_NAME'}) ||
defined($ENV{'FOREIGN_MODULE_SEC_CHECK'})) &&
@@ -5759,16 +5769,6 @@ if ($module_name && !$main::no_acl_check &&
$main::no_acl_check++;
}
-if (!$main::allow_rpc_only &&
- $main::webmin_script_type eq 'web' &&
- !$main::no_acl_check &&
- !defined($ENV{'FOREIGN_MODULE_NAME'})) {
- # Check if this user is RPC-only
- if (&webmin_user_can_rpc() == 2) {
- &error($text{'erpconly'});
- }
- }
-
# Check the Referer: header for nasty redirects
my @referers = split(/\s+/, $gconfig{'referers'});
my $referer_site;
@@ -10179,10 +10179,15 @@ sub filter_javascript
my ($rv, $type) = @_;
if (!$type || $type eq 'html') {
$rv =~ s/<\s*script[^>]*>([\000-\377]*?)<\s*\/script\s*>//gi;
- $rv =~ s/(on(Abort|BeforeUnload|Blur|Change|Click|ContextMenu|Copy|Cut|DblClick|Drag|DragEnd|DragEnter|DragLeave|DragOver|DragStart|DragDrop|Drop|Error|Focus|FocusIn|FocusOut|HashChange|Input|Invalid|KeyDown|KeyPress|KeyUp|Load|MouseDown|MouseEnter|MouseLeave|MouseMove|MouseOut|MouseOver|MouseUp|Move|Paste|PageShow|PageHide|Reset|Resize|Scroll|Search|Select|Submit|Toggle|Unload)=)/x$1/gi;
$rv =~ s/(javascript(:|:|:|:))/x$1/gi;
$rv =~ s/(vbscript(:|:|:|:))/x$1/gi;
- $rv =~ s/<([^>]*\s|)(on\S+=)(.*)>/<$1x$2$3>/gi;
+ my $event_attr = qr/on[a-z][a-z0-9_:-]*\s*=/i;
+ my $event_attrs;
+ do {
+ $event_attrs = 0;
+ $event_attrs += $rv =~ s{(<[^>]*?)([\s/]+)($event_attr)}{$1$2x$3}g;
+ $event_attrs += $rv =~ s{(<)($event_attr)}{$1x$2}g;
+ } while ($event_attrs);
}
if ($type eq 'pdf') {
$rv =~ s/([\n]*)<<[\n((?:.*?|\n)*?)][\w\s\/]+[\n((?:.*?|\n)*?)][\w\s\/]+JavaScript[\w\s\/]*[\n((?:.*?|\n)*?)][\w\s\/]+\s.*?>>[\n]*/$1/gmsi;
diff --git a/webmin/index.cgi b/webmin/index.cgi
index 6db8c571d..213f9bc54 100755
--- a/webmin/index.cgi
+++ b/webmin/index.cgi
@@ -83,7 +83,7 @@ for(my $i=0; $i<@wlinks; $i++) {
}
}
-print &ui_alert_box(&filter_javascript($in{'message'}), 'success', undef, 1,
+print &ui_alert_box(&html_escape($in{'message'}), 'success', undef, 1,
&html_escape($in{'title'})) if ($in{'message'});
&icons_table(\@wlinks, \@wtitles, \@wicons);
diff --git a/webmin/webmin-lib.pl b/webmin/webmin-lib.pl
index 0e74543a7..86c3c1f64 100755
--- a/webmin/webmin-lib.pl
+++ b/webmin/webmin-lib.pl
@@ -1962,7 +1962,15 @@ my ($title, $msg) = @_;
if (!$gconfig{'restart_async'}) {
&restart_miniserv();
my $msg_redir = "";
- $msg_redir = "?title=".&urlize($title)."&message=".&urlize($msg) if $msg;
+ if ($msg) {
+ $title = defined($title) ? &html_strip($title, " ") : "";
+ $msg = &html_strip($msg, " ");
+ $title =~ s/\s+/ /g;
+ $title =~ s/^\s+|\s+$//g;
+ $msg =~ s/\s+/ /g;
+ $msg =~ s/^\s+|\s+$//g;
+ $msg_redir = "?title=".&urlize($title)."&message=".&urlize($msg);
+ }
&redirect($msg_redir);
return;
}
diff --git a/xmlrpc.cgi b/xmlrpc.cgi
index 9a14aa0ee..aaebefb35 100755
--- a/xmlrpc.cgi
+++ b/xmlrpc.cgi
@@ -19,6 +19,8 @@ BEGIN { push(@INC, "."); };
use WebminCore;
use POSIX;
use Socket;
+
+$main::allow_rpc_only = 1;
$force_lang = $default_lang;
$trust_unknown_referers = 2; # Only trust if referer was not set
&init_config();
@@ -317,4 +319,3 @@ $xmlerr .= "\n";
return $xmlerr;
}
-