| name | Security Practices |
| description | Security patterns and best practices. Use for any security-related work - input validation, authentication, authorization, secrets management, Docker security. Contains learned security preferences and requirements. |
Security Practices
Security patterns and best practices. Updated by the Reflect skill.
Last Updated
2025-01-28
Input Validation
General Rules
- NEVER trust user input
- Validate on both client AND server
- Sanitize output to prevent XSS
- Use parameterized queries to prevent SQL injection
Laravel Validation
class StoreUserRequest extends FormRequest
{
public function rules(): array
{
return [
'email' => 'required|email|unique:users',
'password' => 'required|min:8|confirmed',
];
}
}
TypeScript Validation
import { z } from 'zod'
const userSchema = z.object({
email: z.string().email(),
password: z.string().min(8),
})
Authentication
Laravel
public function __construct()
{
$this->middleware('auth');
}
Gate::authorize('update', $user);
Next.js
export async function middleware(request: NextRequest) {
const token = request.cookies.get('token')
if (!token) return NextResponse.redirect('/login')
}
Secrets Management
Rules
- Never commit secrets to Git
- Use environment variables:
${SECRET_NAME}
- Add
.env files to .gitignore
Laravel
$apiKey = env('API_KEY', 'default-value');
config('services.api.key')
Next.js
const apiKey = process.env.API_KEY
const publicUrl = process.env.NEXT_PUBLIC_API_URL
Docker Security
Mandatory Requirements
-
Non-Root Users
user: "1000:1000"
-
Security Options
security_opt:
- no-new-privileges:true
-
No Hardcoded Secrets
environment:
- DB_PASSWORD=${DB_PASSWORD}
-
Resource Limits
deploy:
resources:
limits:
cpus: '2'
memory: 1G
Security Scanning
Trivy (Recommended):
trivy image <image-name>
trivy image --severity HIGH,CRITICAL <image-name>
Docker Scout:
docker scout cves <image-name>
Common Vulnerabilities
SQL Injection
DB::select("SELECT * FROM users WHERE id = $id");
DB::select('SELECT * FROM users WHERE id = ?', [$id]);
User::where('id', $id)->first();
XSS
<!-- ❌ BAD -->
<div v-html="userInput"></div>
<!-- ✅ GOOD -->
<div>{{ userInput }}</div>
CSRF
@csrf
<meta name="csrf-token" content="{{ csrf_token() }}">
Learned Patterns
This section grows as the Reflect skill learns from sessions
Session 2025-01-28
- Learned: Always validate on server, never trust client validation
- Learned: Use prepared statements, never concatenate SQL
- Learned: Sanitize all user input before display