From d5cf0778108da6980c59535665115ed712a7d688 Mon Sep 17 00:00:00 2001 From: Thomas Vincent Date: Sun, 15 Mar 2026 16:21:32 -0700 Subject: [PATCH 1/3] security: migrate audit SQL helpers to prepared variants --- audit.php | 88 ++++++++++++++++-------------- setup.php | 32 +++++++---- tests/test_prepared_statements.php | 59 ++++++++++++++++++++ 3 files changed, 125 insertions(+), 54 deletions(-) create mode 100644 tests/test_prepared_statements.php diff --git a/audit.php b/audit.php index dffed41..2a95bb9 100644 --- a/audit.php +++ b/audit.php @@ -150,28 +150,14 @@ function audit_purge() { function audit_export_rows() { process_request_vars(); - /* form the 'where' clause for our main sql query */ - if (get_request_var('filter') != '') { - $sql_where = 'WHERE ( - page LIKE ' . db_qstr('%' . get_request_var('filter') . '%') . ' - OR post LIKE ' . db_qstr('%' . get_request_var('filter') . '%') . ')'; - } else { - $sql_where = ''; - } + list($sql_where, $sql_params) = audit_build_filter_sql(); - if (get_request_var('event_page') != '-1') { - $sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . ' page = ' . db_qstr(get_request_var('event_page')); - } - - if (!isempty_request_var('user_id') && get_request_var('user_id') > '-1') { - $sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . ' user_id = ' . get_request_var('user_id'); - } - - $events = db_fetch_assoc("SELECT audit_log.*, user_auth.username + $events = db_fetch_assoc_prepared("SELECT audit_log.*, user_auth.username FROM audit_log LEFT JOIN user_auth ON audit_log.user_id=user_auth.id - $sql_where"); + $sql_where", + $sql_params); if (cacti_sizeof($events)) { header('Content-Disposition: attachment; filename=audit_export.csv'); @@ -252,6 +238,31 @@ function process_request_vars() { /* ================= input validation ================= */ } +function audit_build_filter_sql() { + $sql_where = ''; + $sql_params = array(); + + if (get_request_var('filter') != '') { + $sql_where = 'WHERE ( + page LIKE ? + OR post LIKE ?)'; + $sql_params[] = '%' . get_request_var('filter') . '%'; + $sql_params[] = '%' . get_request_var('filter') . '%'; + } + + if (get_request_var('event_page') != '-1') { + $sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . ' page = ?'; + $sql_params[] = get_request_var('event_page'); + } + + if (!isempty_request_var('user_id') && get_request_var('user_id') > '-1') { + $sql_where .= ($sql_where != '' ? ' AND ':'WHERE ') . ' user_id = ?'; + $sql_params[] = get_request_var('user_id'); + } + + return array($sql_where, $sql_params); +} + function audit_log() { global $item_rows; @@ -284,7 +295,10 @@ function audit_log() {