$ shellfirm
Protection Coverage

Databases

Protection patterns for SQL, PostgreSQL, MySQL, MongoDB, and Redis operations

shellfirm covers destructive database operations across five check groups: database (generic SQL), psql (PostgreSQL), mysql (MySQL), mongodb (MongoDB), and redis (Redis).

Generic SQL checks (database)

These checks match standard SQL statements regardless of which database client you use. Patterns are case-insensitive.

DROP DATABASE

IDdatabase:drop_database
SeverityCritical
-- Triggers
DROP DATABASE customers;
drop database myapp;

DROP TABLE

IDdatabase:drop_table
SeverityCritical
-- Triggers
DROP TABLE users;
drop table orders;

TRUNCATE TABLE

IDdatabase:truncate_table
SeverityCritical
-- Triggers
TRUNCATE TABLE sessions;
truncate table logs;

DELETE without WHERE

IDdatabase:delete_all_rows
SeverityCritical
FiltersNotContains WHERE, NotContains where
AlternativeDELETE FROM <table> WHERE <condition> -- always include a WHERE clause
-- Triggers
DELETE FROM users;
delete from orders;

-- Does NOT trigger (has WHERE clause)
DELETE FROM users WHERE id = 5;
delete from orders where status = 'cancelled';

UPDATE without WHERE

IDdatabase:update_all_rows
SeverityHigh
FiltersNotContains WHERE, NotContains where
-- Triggers
UPDATE users SET active = false;
update orders set status = 'cancelled';

-- Does NOT trigger
UPDATE users SET active = false WHERE created_at < '2024-01-01';

PostgreSQL checks (psql)

DROP via psql CLI

IDpsql:drop
SeverityCritical
# Triggers
psql -c "DROP DATABASE myapp"
psql -h localhost -c "DROP TABLE users"

MySQL checks (mysql)

DROP via mysql CLI

IDmysql:drop
SeverityCritical
# Triggers
mysql -e "DROP DATABASE myapp"
mysql -u root -e "DROP TABLE users"

MongoDB checks (mongodb)

Drop via mongosh CLI

IDmongodb:drop
SeverityCritical
# Triggers
mongosh --eval "db.users.drop()"
mongo --eval "db.dropDatabase()"

Interactive drop collection

IDmongodb:interactive_drop_collection
SeverityCritical

Caught when using shellfirm wrap with a MongoDB session:

// Triggers (in interactive mongosh session)
db.users.drop()
db.orders.drop()

Interactive drop database

IDmongodb:interactive_drop_database
SeverityCritical
// Triggers (in interactive mongosh session)
db.dropDatabase()

Redis checks (redis)

FLUSHALL via CLI

IDredis:flushall
SeverityCritical
Alternativeredis-cli FLUSHDB -- only clears the current database, not all databases
# Triggers
redis-cli FLUSHALL

FLUSHDB via CLI

IDredis:flushdb
SeverityHigh
# Triggers
redis-cli FLUSHDB

Interactive Redis commands

These patterns are caught when using shellfirm wrap with a Redis session:

IDCommandSeverity
redis:interactive_flushallFLUSHALLCritical
redis:interactive_flushdbFLUSHDBHigh
redis:interactive_shutdownSHUTDOWN or SHUTDOWN NOSAVECritical

Summary table

IDCommandSeverityFilters
database:drop_databaseDROP DATABASECritical--
database:drop_tableDROP TABLECritical--
database:truncate_tableTRUNCATE TABLECritical--
database:delete_all_rowsDELETE FROM (no WHERE)CriticalNotContains WHERE
database:update_all_rowsUPDATE SET (no WHERE)HighNotContains WHERE
psql:droppsql -c DROPCritical--
mysql:dropmysql -e DROPCritical--
mongodb:dropmongosh --eval dropCritical--
mongodb:interactive_drop_collectiondb.collection.drop()Critical--
mongodb:interactive_drop_databasedb.dropDatabase()Critical--
redis:flushallredis-cli FLUSHALLCritical--
redis:flushdbredis-cli FLUSHDBHigh--
redis:interactive_flushallFLUSHALL (interactive)Critical--
redis:interactive_flushdbFLUSHDB (interactive)High--
redis:interactive_shutdownSHUTDOWN (interactive)Critical--

Interactive database sessions

The MongoDB and Redis interactive patterns are designed to work with shellfirm wrap, which creates a PTY proxy around your database client. See Interactive Wrapper for setup instructions.