---
title: "Security"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Security}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r setup, include = FALSE}
knitr::opts_chunk$set(message = FALSE, warning = FALSE)
```
```{r}
library(TextAnalysisR)
mydata <- SpecialEduTech[seq_len(5), c("title", "abstract")]
united <- unite_cols(mydata, listed_vars = c("title", "abstract"))
toks <- prep_texts(united, text_field = "united_texts")
quanteda::ndoc(toks)
```
TextAnalysisR includes built-in security features.
## Input Validation
| Feature | Description |
|---------|-------------|
| File uploads | Extension whitelist, 50MB limit, malicious content scanning |
| Text and LLM inputs | XSS and prompt injection filtering |
| Column names | Regex validation to prevent formula injection |
## API Key Security
- Stored via `.env` or environment variables (never logged or persisted)
- Masked input field with format validation
- Transmitted via secure headers only
**Environment Variable:** add `OPENAI_API_KEY=...` to `.Renviron`, or set in-session:
```{r, eval = FALSE}
Sys.setenv(OPENAI_API_KEY = "sk-...")
```
## Network Security
- Content Security Policy, X-Frame-Options, SRI for CDN resources
- HTTPS with TLS 1.2+ via Nginx/Cloudflare
## Data Protection
- Session-scoped with no persistent storage, cookies, or identifiers
- Rate limiting: 100 requests/hour per session
- Security event logging with sanitized error messages
- Local processing option (FERPA/HIPAA compatible)
## Infrastructure
- Cloudflare DNS with DDoS protection
- Docker + Nginx deployment