Secure Defaults in Modern Frameworks

By Davy Rogers

Frameworks do a lot. Know the gaps.

Use the framework as intended, it protects you. Break from patterns - raw queries, manual HTML - you lose protections.

XSS protection

FrameworkDefaultGap
React/Next.jsJSX auto-escapesdangerouslySetInnerHTML; href/src don't validate schemes
Vue/Nuxt{{ }} auto-escapesv-html renders raw
AngularSanitises DOM bindingsbypassSecurityTrustHtml()
DjangoTemplates auto-escape`
Rails ERB<%= %> auto-escapesraw() and html_safe
Thymeleafth:text escapesth:utext unescaped

SQL injection

FrameworkDefaultGap
Django ORMParameterisedraw(), extra()
ActiveRecordParameterisedfind_by_sql, where("name = '#{name}'")
SQLAlchemyParameterisedtext() with formatting
SequelizeParameterisedsequelize.query() misused
PrismaParameterised (tagged-template $queryRaw)$queryRawUnsafe, or $queryRaw built by string concatenation

CSRF

FrameworkDefaultGap
DjangoMiddleware on@csrf_exempt
Railsprotect_from_forgery onAPI often skips
Next.js/ExpressNo built-inAdd yourself

Auth

FrameworkDefault
DjangoBuilt-in auth, sessions, CSRF
RailsDevise common (not built-in)
Next.jsNo built-in (NextAuth.js common)
ExpressNo built-in (Passport.js common)

Node/Express = you assemble from components = more misconfiguration risk.

Security headers

Most frameworks don't set HSTS, CSP, X-Frame-Options by default. Add via middleware (Django SecurityMiddleware, Helmet.js for Express).

File uploads

No framework provides safe upload handling by default. Validate content, sanitise filenames, store outside web root.

Debug mode

Never run debug in prod. Change default secrets. Restrict admin endpoints.

The takeaway

Know what your framework does by default. Know the escape hatches. Know what you add yourself. Most dangerous assumption: the framework handles everything.

Want a professional to look at it?Get an AppSec Health Check.