From 582cbf7bde9cb4b0a881e10ed2ffed92dcbc1f8d Mon Sep 17 00:00:00 2001 From: Marius Cramer <m.cramer@pixcept.de> Date: Thu, 21 May 2015 04:13:11 -0400 Subject: [PATCH] - added csrf protection to tforms - possible sql injection in monitor sys_state --- interface/lib/classes/tform.inc.php | 64 ++++++++++++++++++++++++++++++- 1 files changed, 61 insertions(+), 3 deletions(-) diff --git a/interface/lib/classes/tform.inc.php b/interface/lib/classes/tform.inc.php index 4522304..94f72c0 100644 --- a/interface/lib/classes/tform.inc.php +++ b/interface/lib/classes/tform.inc.php @@ -157,7 +157,6 @@ return true; } - /** * Converts the data in the array to human readable format * Datatype conversion e.g. to show the data in lists @@ -384,7 +383,31 @@ if(!is_array($this->formDef)) $app->error("No form definition found."); if(!is_array($this->formDef['tabs'][$tab])) $app->error("The tab is empty or does not exist (TAB: $tab)."); - + + /* CSRF PROTECTION */ + // generate csrf protection id and key + $_csrf_id = uniqid($this->formDef['name'] . '_'); + $_csrf_value = sha1(uniqid(microtime(true), true)); + if(!isset($_SESSION['_csrf'])) $_SESSION['_csrf'] = array(); + if(!isset($_SESSION['_csrf_timeout'])) $_SESSION['_csrf_timeout'] = array(); + $_SESSION['_csrf'][$_csrf_id] = $_csrf_value; + $_SESSION['_csrf_timeout'][$_csrf_id] = time() + 3600; // timeout hash in 1 hour + $this->formDef['tabs'][$tab]['fields']['_csrf_id'] = array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => $_csrf_id, + 'value' => $_csrf_id + ); + $this->formDef['tabs'][$tab]['fields']['_csrf_key'] = array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => $_csrf_value, + 'value' => $_csrf_value + ); + $record['_csrf_id'] = $_csrf_id; + $record['_csrf_key'] = $_csrf_value; + /* CSRF PROTECTION */ + $new_record = array(); if($action == 'EDIT') { $record = $this->decode($record, $tab); @@ -644,7 +667,42 @@ if(!is_array($this->formDef['tabs'][$tab])) $app->error("Tab is empty or does not exist (TAB: $tab)."); //$this->errorMessage = ''; - + + /* CSRF PROTECTION */ + if(isset($_POST) && is_array($_POST)) { + $_csrf_valid = false; + if(isset($_POST['_csrf_id']) && isset($_POST['_csrf_key'])) { + $_csrf_id = trim($_POST['_csrf_id']); + $_csrf_key = trim($_POST['_csrf_key']); + if(isset($_SESSION['_csrf']) && isset($_SESSION['_csrf'][$_csrf_id]) && isset($_SESSION['_csrf_timeout']) && isset($_SESSION['_csrf_timeout'][$_csrf_id])) { + if($_SESSION['_csrf'][$_csrf_id] === $_csrf_key && $_SESSION['_csrf_timeout'] >= time()) $_csrf_valid = true; + } + } + if($_csrf_valid !== true) { + $app->log('CSRF attempt blocked. Referer: ' . (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : 'unknown'), LOGLEVEL_WARN); + unset($_POST); + unset($record); + } + $_SESSION['_csrf'][$_csrf_id] = ' '; + $_SESSION['_csrf_timeout'][$_csrf_id] = ' '; + unset($_SESSION['_csrf'][$_csrf_id]); + unset($_SESSION['_csrf_timeout'][$_csrf_id]); + + if(isset($_SESSION['_csrf_timeout']) && is_array($_SESSION['_csrf_timeout'])) { + $to_unset = array(); + foreach($_SESSION['_csrf_timeout'] as $_csrf_id => $timeout) { + if($timeout < time()) $to_unset[] = $_csrf_id; + } + foreach($to_unset as $_csrf_id) { + unset($_SESSION['_csrf'][$_csrf_id]); + unset($_SESSION['_csrf_timeout'][$_csrf_id]); + } + unset($to_unset); + } + } + /* CSRF PROTECTION */ + + $new_record = array(); if(is_array($record)) { foreach($this->formDef['tabs'][$tab]['fields'] as $key => $field) { -- Gitblit v1.9.1