diff --git a/html/includes/api_functions.inc.php b/html/includes/api_functions.inc.php index 277040e4b7..8e03d26edd 100644 --- a/html/includes/api_functions.inc.php +++ b/html/includes/api_functions.inc.php @@ -818,6 +818,7 @@ function get_port_graphs() } else { $columns = 'ifName'; } + validate_column_list($columns, 'ports'); // use hostname as device_id if it's all digits $device_id = ctype_digit($hostname) ? $hostname : getidbyname($hostname); @@ -890,6 +891,7 @@ function get_all_ports() } else { $columns = 'ifName'; } + validate_column_list($columns, 'ports'); $ports = dbFetchRows("SELECT $columns FROM `ports` WHERE `deleted` = 0"); $output = array( @@ -1693,3 +1695,25 @@ function list_logs() $app->response->headers->set('Content-Type', 'application/json'); echo _json_encode($output); } + +function validate_column_list($columns, $tableName) +{ + global $config; + + $column_names = explode(',', $columns); + $db_schema = Symfony\Component\Yaml\Yaml::parse(file_get_contents($config['install_dir'] . '/misc/db_schema.yaml')); + $valid_columns = array_column($db_schema[$tableName]['Columns'], 'Field'); + $invalid_columns = array_diff(array_map('trim', $column_names), $valid_columns); + + if (count($invalid_columns) > 0) { + $output = array( + 'status' => 'error', + 'message' => 'Invalid columns: ' . join(',', $invalid_columns), + ); + $app = \Slim\Slim::getInstance(); + $app->response->setStatus(400); // Bad request + $app->response->headers->set('Content-Type', 'application/json'); + echo _json_encode($output); + $app->stop(); + } +}