Module: Dbviewer::Validator::Sql::ValidationConfig

Defined in:
lib/dbviewer/validator/sql/validation_config.rb

Overview

Configuration constants and patterns for SQL validation This module centralizes all security-related patterns and rules used throughout the validation process.

Constant Summary collapse

FORBIDDEN_KEYWORDS =

List of SQL keywords that could modify data or schema These keywords are completely forbidden in user queries

%w[
  UPDATE INSERT DELETE DROP ALTER CREATE TRUNCATE REPLACE
  RENAME GRANT REVOKE LOCK UNLOCK COMMIT ROLLBACK
  SAVEPOINT INTO CALL EXECUTE EXEC
].freeze
CONDITIONAL_KEYWORDS =

List of SQL keywords that should only be allowed in specific contexts These are monitored but not automatically blocked

{
  # JOIN is allowed, but we should check for suspicious patterns
  "JOIN" => /\bJOIN\b/i,
  # UNION is allowed, but potential for injection
  "UNION" => /\bUNION\b/i,
  # WITH is allowed for CTEs, but need to ensure it's not a data modification
  "WITH" => /\bWITH\b/i
}.freeze
DEFAULT_MAX_QUERY_LENGTH =

Maximum allowed query length (can be overridden by configuration)

10000
SUSPICIOUS_PATTERNS =

Patterns for detecting suspicious content that might indicate attacks

{
  comment_injection: /\s+--|\/\*/,
  string_concatenation: /\|\||CONCAT\s*\(/i,
  hex_encoding: /0x[0-9a-f]{16,}/i,
  # Additional suspicious patterns
  char_function: /\bCHAR\s*\(\s*\d+(\s*,\s*\d+){4,}/i, # Only flag when many parameters like CHAR(65,68,77,73,78)
  ascii_function: /\bASCII\s*\(/i,
  substring_injection: /\bSUBSTRING\s*\(\s*(@@|version|user|database)/i, # Only when extracting system info
  length_functions: /\b(LENGTH|LEN|CHAR_LENGTH)\s*\(\s*(@@|version|user|database)/i, # Only on system functions
  conditional_comments: /\/\*!\d+/,
  encoded_spaces: /%20|%09|%0a|%0d/i,
  multiple_unions: /\bUNION\b.*\bUNION\b/i,
  nested_selects: /\bSELECT\b.*\bSELECT\b.*\bSELECT\b/i,
  script_tags: /<script|<\/script>/i,
  php_tags: /<\?php|<\?=/i,
  null_byte: /\x00/,
  excessive_parentheses: /\({5,}|\){5,}/
}.freeze
INJECTION_PATTERNS =

SQL injection attack patterns - these are definitive threats

{
  basic_or_injection: /'\s*OR\s*'.*'\s*=\s*'/i,
  quoted_or_equals: /'\s*OR\s*1\s*=\s*1/i,
  unquoted_or_equals: /\s+OR\s+1\s*=\s*1/i,
  comment_termination: /'\s*;\s*--/i,
  version_detection: /@@version/i,
  version_function: /version\(\)/i,
  file_access: /\bLOAD_FILE\s*\(/i,
  outfile_access: /\bINTO\s+OUTFILE\b/i,
  dumpfile_access: /\bINTO\s+DUMPFILE\b/i,
  # Additional injection patterns for enhanced security
  sleep_injection: /\b(SLEEP|WAITFOR|DELAY)\s*\(/i,
  benchmark_injection: /\bBENCHMARK\s*\(/i,
  information_schema: /\binformation_schema\./i,
  mysql_user: /\bmysql\.user\b/i,
  pg_user: /\bpg_user\b/i,
  system_functions: /\b(system|exec|shell|cmd)\s*\(/i,
  database_functions: /\b(database|schema|user|current_user)\s*\(\s*\)/i,
  stacked_queries: /;\s*(SELECT|INSERT|UPDATE|DELETE|DROP|CREATE)/i,
  time_based_blind: /\bIF\s*\(\s*\d+\s*=\s*\d+\s*,\s*SLEEP\s*\(/i,
  error_based: /\bCONVERT\s*\(\s*INT\s*,/i,
  xpath_injection: /\bEXTRACTVALUE\s*\(/i
}.freeze
FEATURE_PATTERNS =

Database feature detection patterns for query analysis

{
  join: /\b(INNER|LEFT|RIGHT|FULL|CROSS)?\s*JOIN\b/i,
  order_by: /\bORDER\s+BY\b/i,
  group_by: /\bGROUP\s+BY\b/i,
  having: /\bHAVING\b/i,
  union: /\bUNION\b/i,
  window_function: /\bOVER\s*\(/i
}.freeze
QUOTE_LIMIT =

Thresholds for suspicious activity detection

20
HEX_MIN_LENGTH =

Maximum number of quotes before flagging as suspicious

16
PRAGMA_PATTERN =

PRAGMA statement pattern for SQLite introspection

/\A\s*PRAGMA\s+[a-z0-9_]+(\([^)]*\))?\s*\z/i
VALID_QUERY_START_PATTERN =

Valid query start patterns (SELECT or WITH for CTEs)

/\A\s*(SELECT|WITH)\s+/i