cursorrules / rules
ivangrynenko/cursorrules/.cursor/rules/drupal-insecure-design.mdc
Detect and prevent insecure design patterns in Drupal as defined in OWASP Top 10:2021-A04
Cursor rule88 starsChanged 11 months ago
---
description: Detect and prevent insecure design patterns in Drupal as defined in OWASP Top 10:2021-A04
globs: *.php, *.install, *.module, *.inc, *.theme, *.yml, *.info
alwaysApply: false
---
# Drupal Insecure Design Security Standards (OWASP A04:2021)
This rule enforces security best practices to prevent insecure design vulnerabilities in Drupal applications, as defined in OWASP Top 10:2021-A04.
## Rule Details
- **Name:** drupal_insecure_design
- **Description:** Detect and prevent insecure design patterns in Drupal as defined in OWASP Top 10:2021-A04
## Filters
- file extension pattern: `\\.(php|inc|module|install|theme|info\\.yml)$`
- file path pattern: `(modules|themes|profiles)/custom`
## Enforcement Checks
- Conditions:
- pattern `\\$permissions\\[['\"][^'\"]+['\"]\\]\\s*=\\s*array\\((?![^)]*(administer|manage|edit|delete)[^)]*(content|configuration|users)).*?\\);` – Permissions should follow Drupal naming patterns (verb + object) and be specific. Avoid overly broad permissions.
- Pattern 1: Insecure permission design
- pattern `if\\s*\\([^\\)]*===?\\s*['\"][a-zA-Z0-9_]+['\"]\\s*\\)` – Consider moving business logic rules to configuration to allow for proper adjustment without code changes.
- Pattern 2: Hard-coded business logic values
- pattern `preg_replace|str_replace|strip_tags` – Avoid ad hoc sanitization. Use Drupal's built-in sanitization tools: t(), Xss::filter(), etc.
- Pattern 3: Ad hoc input sanitization
- pattern `class\\s+[a-zA-Z0-9_]+Controller.+\\{[^}]*->query\\(` – Follow separation of concerns. Move database logic to services or repositories, not in controllers.
- Pattern 4: Database logic in controllers
- pattern `function\\s+[a-zA-Z0-9_]+_entity_access\\([^)]*\\)\\s*\\{[^}]*return\\s+AccessResult::allowed\\(\\);` – Avoid unconditional access grants. Implement proper conditional checks based on roles, permissions, or entity ownership.
- Pattern 5: Weak entity access policy
- pattern `session_start|session_set_cookie_params` – Avoid custom session management. Use Drupal's session handling system and services.
- Pattern 6: Custom session management
- pattern `(?:\\\\Drupal::[a-zA-Z_]+\\(\\).*){3,}` – Excessive static service calls indicate poor dependency injection. Use proper service injection.
- Pattern 7: Excessive global state dependency
- pattern `password_verify\\(|password_hash\\(` – Avoid custom authentication. Use Drupal's built-in authentication system and services.
- Pattern 8: Custom user authentication
- pattern `function\\s+[a-zA-Z0-9_]+_schema\\(\\)[^{]*\\{[^}]*return\\s+\\$schema;(?![^}]*validate_utf8|[^}]*'not null')` – Database schemas should enforce data integrity with proper constraints (NOT NULL, length, etc.).
- Pattern 9: Missing schema definitions
- pattern `\\$config\\[['\"](mdc:?!secure_|security_|private_)[^'\"]+['\"]\\]\\s*=\\s*(?:FALSE|0|'0'|\"0\");` – Security-related configuration should default to secure settings (opt-in for potentially insecure features).
- Pattern 10: Insecure defaults
## Suggestions
- Guidance:
**Drupal Secure Design Best Practices:**
1. **Secure Architecture Principles:**
- Follow the principle of least privilege for all user roles and permissions
- Implement defense in depth with multiple security layers
- Use Drupal's entity/field API for structured data instead of custom tables
- Employ service-oriented architecture with proper dependency injection
- Follow Drupal coding standards to leverage community security expertise
2. **Permission System Design:**
- Design granular permissions following the verb+object pattern
- Avoid creating omnipotent permissions that grant excessive access
- Use context-aware access systems like Entity Access or Node Grants
- Consider record-based and field-based access for better control
- Document permission architecture and security implications
3. **Module Architecture:**
- Separate concerns into appropriate services
- Use hooks judiciously and document security implications
- Implement proper validation and sanitization layers
- Design APIs with security in mind from the start
- Provide secure default configurations
4. **Data Modeling Security:**
- Implement appropriate validation constraints on entity fields
- Design schema definitions with integrity constraints
- Use appropriate field types for sensitive data
- Implement field-level access control when needed
- Consider encryption for sensitive stored data
5. **Error Handling and Logging:**
- Design contextual error messages (detailed for admins, general for users)
- Implement appropriate logging for security events
- Avoid exposing sensitive data in error messages
- Design fault-tolerant systems that fail securely
- Include appropriate transaction management
## Validation Checks
- Conditions:
- pattern `protected\\s+\\$[a-zA-Z0-9_]+;[^}]*public\\s+function\\s+__construct\\([^\\)]*\\)` – Using proper dependency injection pattern.
- Check 1: Proper dependency injection
- pattern `config\\/schema\\/[a-zA-Z0-9_]+\\.schema\\.yml` – Providing configuration schema for validation.
- Check 2: Configuration schema usage
- pattern `\\$permissions\\[['\"][a-z\\s]+[a-z0-9\\s]+['\"]\\]\\s*=\\s*\\[` – Following permission naming conventions.
- Check 3: Proper permission definition
- pattern `@EntityAccessControl\\(|class\\s+[a-zA-Z0-9_]+AccessControlHandler\\s+extends\\s+` – Using dedicated access control handlers for entities.
- Check 4: Entity access handlers
## Metadata
- Priority: high
- Version: 1.1
- Tags: security, drupal, design, architecture, owasp, language:php, framework:drupal, category:security, subcategory:design, standard:owasp-top10, risk:a04-insecure-design
## References
- https://owasp.org/Top10/A04_2021-Insecure_Design/
- https://www.drupal.org/docs/develop/security-in-drupal
- https://www.drupal.org/docs/8/api/entity-api/access-control-for-entities
- https://www.drupal.org/docs/8/api/configuration-api/configuration-schemametadata
Discussion
Did this work in your project? Say what you used it for and what you changed. People and their agents can both post here.
Posts are public.Sign in to post
No one has posted yet. Be the first.

