From b2a97ee190c6dc3e30b9c36b9c33c33348dde4d6 Mon Sep 17 00:00:00 2001
From: Matthew Noorenberghe
Date: Sat, 9 Feb 2019 15:10:42 -0800
Subject: [PATCH] frame.php: Fix multiple XSS from 'show' and 'scale'
parameters and enforce CSP.
Fixes #2448, fixes #2449, and fixes #2447.
---
web/includes/functions.php | 1 +
web/skins/classic/css/base/views/frame.css | 5 ----
web/skins/classic/css/classic/views/frame.css | 5 ----
web/skins/classic/css/dark/views/frame.css | 5 ----
web/skins/classic/views/frame.php | 23 ++++++++++---------
web/skins/classic/views/js/frame.js | 8 ++++++-
web/skins/classic/views/js/frame.js.php | 2 +-
7 files changed, 21 insertions(+), 28 deletions(-)
diff --git a/web/includes/functions.php b/web/includes/functions.php
index a3723c635..85e3b022c 100644
--- a/web/includes/functions.php
+++ b/web/includes/functions.php
@@ -56,6 +56,7 @@ function CSPHeaders($view, $nonce) {
case 'download':
case 'error':
case 'export':
+ case 'frame':
case 'function':
case 'log':
case 'logout':
diff --git a/web/skins/classic/css/base/views/frame.css b/web/skins/classic/css/base/views/frame.css
index c9cb1846c..947fee1bc 100644
--- a/web/skins/classic/css/base/views/frame.css
+++ b/web/skins/classic/css/base/views/frame.css
@@ -9,8 +9,3 @@
display: flex;
justify-content: space-between;
}
-
-#controls a {
- width: 40px;
- margin-left: -20px;
-}
diff --git a/web/skins/classic/css/classic/views/frame.css b/web/skins/classic/css/classic/views/frame.css
index c9cb1846c..947fee1bc 100644
--- a/web/skins/classic/css/classic/views/frame.css
+++ b/web/skins/classic/css/classic/views/frame.css
@@ -9,8 +9,3 @@
display: flex;
justify-content: space-between;
}
-
-#controls a {
- width: 40px;
- margin-left: -20px;
-}
diff --git a/web/skins/classic/css/dark/views/frame.css b/web/skins/classic/css/dark/views/frame.css
index c9cb1846c..947fee1bc 100644
--- a/web/skins/classic/css/dark/views/frame.css
+++ b/web/skins/classic/css/dark/views/frame.css
@@ -9,8 +9,3 @@
display: flex;
justify-content: space-between;
}
-
-#controls a {
- width: 40px;
- margin-left: -20px;
-}
diff --git a/web/skins/classic/views/frame.php b/web/skins/classic/views/frame.php
index 931951056..ae69fecba 100644
--- a/web/skins/classic/views/frame.php
+++ b/web/skins/classic/views/frame.php
@@ -51,14 +51,15 @@ $lastFid = $maxFid;
$alarmFrame = $Frame->Type()=='Alarm';
if ( isset( $_REQUEST['scale'] ) ) {
- $scale = $_REQUEST['scale'];
+ $scale = validNum($_REQUEST['scale']);
} else if ( isset( $_COOKIE['zmWatchScale'.$Monitor->Id()] ) ) {
- $scale = $_COOKIE['zmWatchScale'.$Monitor->Id()];
+ $scale = validNum($_COOKIE['zmWatchScale'.$Monitor->Id()]);
} else if ( isset( $_COOKIE['zmWatchScale'] ) ) {
- $scale = $_COOKIE['zmWatchScale'];
+ $scale = validNum($_COOKIE['zmWatchScale']);
} else {
$scale = max( reScale( SCALE_BASE, $Monitor->DefaultScale(), ZM_WEB_DEFAULT_SCALE ), SCALE_BASE );
}
+$scale = $scale ?: "auto";
$imageData = $Event->getImageSrc( $frame, $scale, 0 );
if ( ! $imageData ) {
@@ -67,7 +68,7 @@ if ( ! $imageData ) {
}
$show = 'capt';
-if ( isset($_REQUEST['show']) ) {
+if (isset($_REQUEST['show']) && in_array($_REQUEST['show'], array('capt', 'anal'))) {
$show = $_REQUEST['show'];
} else if ( $imageData['hasAnalImage'] ) {
$show = 'anal';
@@ -89,9 +90,9 @@ xhtmlHeaders(__FILE__, translate('Frame').' - '.$Event->Id()." - ".$Frame->Frame
-
+
Id().'-'.$Frame->FrameId().' ('.$Frame->Score().')' ?>
@@ -103,19 +104,19 @@ xhtmlHeaders(__FILE__, translate('Frame').' - '.$Event->Id()." - ".$Frame->Frame
', $Event->Id(), $Frame->FrameId(), $scale, ( $show=='anal'?'capt':'anal' ) );
} ?>
-
FrameId() ?>" class=""/>
+
FrameId() ?>" class=""/>
FrameId() > 1 ) { ?>
-
-
+
+
FrameId() < $maxFid ) { ?>
-
-
+
+
diff --git a/web/skins/classic/views/js/frame.js b/web/skins/classic/views/js/frame.js
index e0401c7c7..03058ff8a 100644
--- a/web/skins/classic/views/js/frame.js
+++ b/web/skins/classic/views/js/frame.js
@@ -30,4 +30,10 @@ function changeScale() {
});
}
-if (scale == 'auto') $j(document).ready(changeScale);
+if (scale == 'auto') {
+ $j(document).ready(changeScale);
+}
+
+document.addEventListener('DOMContentLoaded', function onDCL() {
+ document.getElementById('scale').addEventListener('change', changeScale);
+});
diff --git a/web/skins/classic/views/js/frame.js.php b/web/skins/classic/views/js/frame.js.php
index c9b3f2eea..572587f82 100644
--- a/web/skins/classic/views/js/frame.js.php
+++ b/web/skins/classic/views/js/frame.js.php
@@ -1,3 +1,3 @@
-var scale = '';
+var scale = '';
var SCALE_BASE = ;