@mytechtoday/augment-extensions 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/augment-extensions/domain-rules/wordpress/README.md +163 -0
- package/augment-extensions/domain-rules/wordpress/module.json +32 -0
- package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -0
- package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -0
- package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -0
- package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -0
- package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -0
- package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -0
- package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -0
- package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -0
- package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -0
- package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -0
- package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -0
- package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -0
- package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -0
- package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -0
- package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -0
- package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -0
- package/augment-extensions/examples/rest-api-plugin/README.md +98 -0
- package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -0
- package/augment-extensions/examples/rest-api-plugin/module.json +40 -0
- package/augment-extensions/examples/woocommerce-extension/README.md +98 -0
- package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -0
- package/augment-extensions/examples/woocommerce-extension/module.json +40 -0
- package/augment-extensions/workflows/wordpress-plugin/README.md +232 -0
- package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -0
- package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -0
- package/augment-extensions/workflows/wordpress-plugin/module.json +49 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -0
- package/cli/dist/cli.js +5 -1
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +41 -0
- package/cli/dist/commands/show.js.map +1 -1
- package/modules.md +52 -0
- package/package.json +1 -1
|
@@ -0,0 +1,752 @@
|
|
|
1
|
+
# Security Audit Workflow Example
|
|
2
|
+
|
|
3
|
+
This example demonstrates a complete security audit workflow for a WordPress plugin using OpenSpec and Beads.
|
|
4
|
+
|
|
5
|
+
## Scenario
|
|
6
|
+
|
|
7
|
+
Performing a comprehensive security audit on the "Simple Contact Form" plugin before submitting to WordPress.org.
|
|
8
|
+
|
|
9
|
+
## Plugin Context
|
|
10
|
+
|
|
11
|
+
**Plugin**: Simple Contact Form
|
|
12
|
+
**Version**: 1.0.0
|
|
13
|
+
**Features**:
|
|
14
|
+
- Frontend contact form
|
|
15
|
+
- Admin page to view submissions
|
|
16
|
+
- Email notifications
|
|
17
|
+
- AJAX form submission
|
|
18
|
+
- Custom fields support
|
|
19
|
+
|
|
20
|
+
**Security Concerns**:
|
|
21
|
+
- Form submissions (CSRF, XSS)
|
|
22
|
+
- Admin actions (capability checks)
|
|
23
|
+
- Database operations (SQL injection)
|
|
24
|
+
- File operations (if any)
|
|
25
|
+
- AJAX handlers (authentication, authorization)
|
|
26
|
+
|
|
27
|
+
## Workflow Steps
|
|
28
|
+
|
|
29
|
+
### Step 1: Create OpenSpec Security Audit Spec
|
|
30
|
+
|
|
31
|
+
**File**: `openspec/specs/security/contact-form-audit.md`
|
|
32
|
+
|
|
33
|
+
```markdown
|
|
34
|
+
---
|
|
35
|
+
id: security/contact-form-audit
|
|
36
|
+
status: active
|
|
37
|
+
relatedTasks: []
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
# Security Audit: Simple Contact Form
|
|
41
|
+
|
|
42
|
+
## Overview
|
|
43
|
+
Comprehensive security audit to identify and fix vulnerabilities before WordPress.org submission.
|
|
44
|
+
|
|
45
|
+
## Audit Scope
|
|
46
|
+
|
|
47
|
+
### Areas to Audit
|
|
48
|
+
1. **CSRF Protection**: All forms and AJAX handlers
|
|
49
|
+
2. **XSS Prevention**: All output escaping
|
|
50
|
+
3. **SQL Injection**: All database queries
|
|
51
|
+
4. **Authentication**: User identity verification
|
|
52
|
+
5. **Authorization**: Capability checks
|
|
53
|
+
6. **Input Validation**: All user inputs
|
|
54
|
+
7. **File Operations**: File uploads/downloads (if applicable)
|
|
55
|
+
8. **API Security**: REST API endpoints (if applicable)
|
|
56
|
+
|
|
57
|
+
### Security Standards
|
|
58
|
+
- OWASP Top 10 compliance
|
|
59
|
+
- WordPress VIP coding standards
|
|
60
|
+
- WordPress.org plugin guidelines
|
|
61
|
+
|
|
62
|
+
## Audit Requirements
|
|
63
|
+
|
|
64
|
+
### Requirement: CSRF Protection
|
|
65
|
+
ALL forms and state-changing operations MUST be protected against CSRF attacks.
|
|
66
|
+
|
|
67
|
+
#### Scenario: Form submission
|
|
68
|
+
- GIVEN a form exists
|
|
69
|
+
- WHEN the form is submitted
|
|
70
|
+
- THEN a valid nonce MUST be present
|
|
71
|
+
- AND the nonce MUST be verified before processing
|
|
72
|
+
|
|
73
|
+
#### Scenario: AJAX request
|
|
74
|
+
- GIVEN an AJAX handler exists
|
|
75
|
+
- WHEN an AJAX request is made
|
|
76
|
+
- THEN a valid nonce MUST be included
|
|
77
|
+
- AND verified with `check_ajax_referer()`
|
|
78
|
+
|
|
79
|
+
### Requirement: XSS Prevention
|
|
80
|
+
ALL output MUST be properly escaped based on context.
|
|
81
|
+
|
|
82
|
+
#### Scenario: HTML output
|
|
83
|
+
- WHEN outputting user data in HTML
|
|
84
|
+
- THEN use `esc_html()` or `esc_attr()`
|
|
85
|
+
|
|
86
|
+
#### Scenario: URL output
|
|
87
|
+
- WHEN outputting URLs
|
|
88
|
+
- THEN use `esc_url()`
|
|
89
|
+
|
|
90
|
+
#### Scenario: JavaScript output
|
|
91
|
+
- WHEN outputting data in JavaScript
|
|
92
|
+
- THEN use `esc_js()` or `wp_json_encode()`
|
|
93
|
+
|
|
94
|
+
### Requirement: SQL Injection Prevention
|
|
95
|
+
ALL database queries MUST use prepared statements.
|
|
96
|
+
|
|
97
|
+
#### Scenario: Custom query
|
|
98
|
+
- WHEN executing a custom database query
|
|
99
|
+
- THEN use `$wpdb->prepare()` with placeholders
|
|
100
|
+
- AND use correct placeholder types (%s, %d, %f)
|
|
101
|
+
|
|
102
|
+
### Requirement: Authorization
|
|
103
|
+
ALL admin actions MUST check user capabilities.
|
|
104
|
+
|
|
105
|
+
#### Scenario: Admin page access
|
|
106
|
+
- WHEN rendering an admin page
|
|
107
|
+
- THEN verify user has required capability
|
|
108
|
+
- AND deny access if capability missing
|
|
109
|
+
|
|
110
|
+
#### Scenario: Data modification
|
|
111
|
+
- WHEN modifying data
|
|
112
|
+
- THEN verify user has permission
|
|
113
|
+
- AND log the action
|
|
114
|
+
|
|
115
|
+
## Testing Requirements
|
|
116
|
+
|
|
117
|
+
### Automated Testing
|
|
118
|
+
- Run PHPCS with WordPress-VIP-Go standard
|
|
119
|
+
- Run security scanner (e.g., WPScan)
|
|
120
|
+
- Check for common vulnerability patterns
|
|
121
|
+
|
|
122
|
+
### Manual Testing
|
|
123
|
+
- Review all forms for nonce verification
|
|
124
|
+
- Review all output for escaping
|
|
125
|
+
- Review all database queries for prepared statements
|
|
126
|
+
- Review all admin actions for capability checks
|
|
127
|
+
- Test with different user roles
|
|
128
|
+
|
|
129
|
+
## Remediation Requirements
|
|
130
|
+
|
|
131
|
+
### Critical Issues
|
|
132
|
+
- MUST be fixed before submission
|
|
133
|
+
- Examples: SQL injection, XSS, CSRF
|
|
134
|
+
|
|
135
|
+
### High Issues
|
|
136
|
+
- SHOULD be fixed before submission
|
|
137
|
+
- Examples: Missing capability checks, weak validation
|
|
138
|
+
|
|
139
|
+
### Medium Issues
|
|
140
|
+
- SHOULD be fixed or documented
|
|
141
|
+
- Examples: Suboptimal escaping, missing sanitization
|
|
142
|
+
|
|
143
|
+
### Low Issues
|
|
144
|
+
- MAY be fixed or documented
|
|
145
|
+
- Examples: Code style, minor improvements
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Step 2: Create Beads Tasks for Security Audit
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
# Create epic for security audit
|
|
152
|
+
bd create "Security Audit: Simple Contact Form" -p 0 --type epic --label security --label audit
|
|
153
|
+
# Returns: bd-sa
|
|
154
|
+
|
|
155
|
+
# Automated scanning
|
|
156
|
+
bd create "Run PHPCS with WordPress-VIP-Go standard" -p 0 --parent bd-sa --label automated
|
|
157
|
+
# Returns: bd-sa.1
|
|
158
|
+
|
|
159
|
+
bd create "Run WPScan security scanner" -p 0 --parent bd-sa --label automated
|
|
160
|
+
# Returns: bd-sa.2
|
|
161
|
+
|
|
162
|
+
# Manual review - CSRF
|
|
163
|
+
bd create "Audit all forms for nonce verification" -p 1 --parent bd-sa --label csrf --label manual
|
|
164
|
+
# Returns: bd-sa.3
|
|
165
|
+
|
|
166
|
+
bd create "Audit all AJAX handlers for nonce verification" -p 1 --parent bd-sa --label csrf --label manual
|
|
167
|
+
# Returns: bd-sa.4
|
|
168
|
+
|
|
169
|
+
# Manual review - XSS
|
|
170
|
+
bd create "Audit all output for proper escaping" -p 1 --parent bd-sa --label xss --label manual
|
|
171
|
+
# Returns: bd-sa.5
|
|
172
|
+
|
|
173
|
+
bd create "Audit all admin pages for escaping" -p 1 --parent bd-sa --label xss --label manual
|
|
174
|
+
# Returns: bd-sa.6
|
|
175
|
+
|
|
176
|
+
# Manual review - SQL Injection
|
|
177
|
+
bd create "Audit all database queries for prepared statements" -p 1 --parent bd-sa --label sql --label manual
|
|
178
|
+
# Returns: bd-sa.7
|
|
179
|
+
|
|
180
|
+
# Manual review - Authorization
|
|
181
|
+
bd create "Audit all admin actions for capability checks" -p 1 --parent bd-sa --label authz --label manual
|
|
182
|
+
# Returns: bd-sa.8
|
|
183
|
+
|
|
184
|
+
bd create "Audit all data modifications for capability checks" -p 1 --parent bd-sa --label authz --label manual
|
|
185
|
+
# Returns: bd-sa.9
|
|
186
|
+
|
|
187
|
+
# Remediation
|
|
188
|
+
bd create "Fix critical security issues" -p 0 --parent bd-sa --label remediation --label critical
|
|
189
|
+
# Returns: bd-sa.10
|
|
190
|
+
|
|
191
|
+
bd create "Fix high security issues" -p 1 --parent bd-sa --label remediation --label high
|
|
192
|
+
# Returns: bd-sa.11
|
|
193
|
+
|
|
194
|
+
bd create "Fix medium security issues" -p 2 --parent bd-sa --label remediation --label medium
|
|
195
|
+
# Returns: bd-sa.12
|
|
196
|
+
|
|
197
|
+
# Documentation
|
|
198
|
+
bd create "Document security audit findings" -p 1 --parent bd-sa --label documentation
|
|
199
|
+
# Returns: bd-sa.13
|
|
200
|
+
|
|
201
|
+
bd create "Create security audit report" -p 1 --parent bd-sa --label documentation
|
|
202
|
+
# Returns: bd-sa.14
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Step 3: Add Task Dependencies
|
|
206
|
+
|
|
207
|
+
```bash
|
|
208
|
+
# Manual reviews can run in parallel after automated scans
|
|
209
|
+
bd dep add bd-sa.3 bd-sa.1
|
|
210
|
+
bd dep add bd-sa.4 bd-sa.1
|
|
211
|
+
bd dep add bd-sa.5 bd-sa.1
|
|
212
|
+
bd dep add bd-sa.6 bd-sa.1
|
|
213
|
+
bd dep add bd-sa.7 bd-sa.1
|
|
214
|
+
bd dep add bd-sa.8 bd-sa.1
|
|
215
|
+
bd dep add bd-sa.9 bd-sa.1
|
|
216
|
+
|
|
217
|
+
# Remediation depends on manual reviews
|
|
218
|
+
bd dep add bd-sa.10 bd-sa.3
|
|
219
|
+
bd dep add bd-sa.10 bd-sa.4
|
|
220
|
+
bd dep add bd-sa.10 bd-sa.5
|
|
221
|
+
bd dep add bd-sa.10 bd-sa.6
|
|
222
|
+
bd dep add bd-sa.10 bd-sa.7
|
|
223
|
+
bd dep add bd-sa.10 bd-sa.8
|
|
224
|
+
bd dep add bd-sa.10 bd-sa.9
|
|
225
|
+
|
|
226
|
+
bd dep add bd-sa.11 bd-sa.10
|
|
227
|
+
bd dep add bd-sa.12 bd-sa.11
|
|
228
|
+
|
|
229
|
+
# Documentation depends on remediation
|
|
230
|
+
bd dep add bd-sa.13 bd-sa.12
|
|
231
|
+
bd dep add bd-sa.14 bd-sa.13
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Step 4: Execute Security Audit
|
|
235
|
+
|
|
236
|
+
#### Task bd-sa.1: Run PHPCS with WordPress-VIP-Go
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
bd update bd-sa.1 --status in_progress
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**Install and run PHPCS**:
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
# Install PHPCS and WordPress standards
|
|
246
|
+
composer require --dev squizlabs/php_codesniffer
|
|
247
|
+
composer require --dev wp-coding-standards/wpcs
|
|
248
|
+
composer require --dev automattic/vipwpcs
|
|
249
|
+
|
|
250
|
+
# Configure PHPCS
|
|
251
|
+
vendor/bin/phpcs --config-set installed_paths vendor/wp-coding-standards/wpcs,vendor/automattic/vipwpcs
|
|
252
|
+
|
|
253
|
+
# Run security scan
|
|
254
|
+
vendor/bin/phpcs --standard=WordPress-VIP-Go --extensions=php --report=summary .
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**Output example**:
|
|
258
|
+
|
|
259
|
+
```
|
|
260
|
+
FILE: /simple-contact-form/includes/class-contact-form.php
|
|
261
|
+
----------------------------------------------------------------------
|
|
262
|
+
FOUND 3 ERRORS AND 2 WARNINGS AFFECTING 5 LINES
|
|
263
|
+
----------------------------------------------------------------------
|
|
264
|
+
45 | ERROR | Direct database query without prepare()
|
|
265
|
+
67 | WARNING | Possible XSS vulnerability - output not escaped
|
|
266
|
+
89 | ERROR | Missing nonce verification
|
|
267
|
+
102 | WARNING | Missing capability check
|
|
268
|
+
125 | ERROR | Unsanitized input from $_POST
|
|
269
|
+
----------------------------------------------------------------------
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
bd comment bd-sa.1 "PHPCS scan completed. Found 3 errors and 2 warnings. Issues logged for remediation."
|
|
274
|
+
bd close bd-sa.1
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
#### Task bd-sa.2: Run WPScan
|
|
278
|
+
|
|
279
|
+
```bash
|
|
280
|
+
bd update bd-sa.2 --status in_progress
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
**Run WPScan** (if available):
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
# Note: WPScan typically scans installed plugins, not source code
|
|
287
|
+
# For source code scanning, use PHPCS or manual review
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
```bash
|
|
291
|
+
bd comment bd-sa.2 "WPScan not applicable for source code. Using PHPCS results instead."
|
|
292
|
+
bd close bd-sa.2
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
#### Task bd-sa.3: Audit Forms for Nonce Verification
|
|
296
|
+
|
|
297
|
+
```bash
|
|
298
|
+
bd ready # Shows bd-sa.3 is ready
|
|
299
|
+
bd update bd-sa.3 --status in_progress
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Manual review process**:
|
|
303
|
+
|
|
304
|
+
1. **Find all forms**:
|
|
305
|
+
```bash
|
|
306
|
+
grep -r "<form" . --include="*.php"
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
2. **Check each form for nonce**:
|
|
310
|
+
|
|
311
|
+
**File**: `admin/partials/settings-page.php`
|
|
312
|
+
|
|
313
|
+
```php
|
|
314
|
+
<!-- BEFORE (VULNERABLE) -->
|
|
315
|
+
<form method="post" action="">
|
|
316
|
+
<input type="text" name="setting_value" />
|
|
317
|
+
<input type="submit" value="Save" />
|
|
318
|
+
</form>
|
|
319
|
+
|
|
320
|
+
<!-- AFTER (SECURE) -->
|
|
321
|
+
<form method="post" action="">
|
|
322
|
+
<?php wp_nonce_field('simple_contact_form_settings', 'scf_settings_nonce'); ?>
|
|
323
|
+
<input type="text" name="setting_value" />
|
|
324
|
+
<input type="submit" value="Save" />
|
|
325
|
+
</form>
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
3. **Check form handler for verification**:
|
|
329
|
+
|
|
330
|
+
**File**: `admin/class-admin.php`
|
|
331
|
+
|
|
332
|
+
```php
|
|
333
|
+
// BEFORE (VULNERABLE)
|
|
334
|
+
public function save_settings() {
|
|
335
|
+
if (isset($_POST['setting_value'])) {
|
|
336
|
+
update_option('scf_setting', $_POST['setting_value']);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// AFTER (SECURE)
|
|
341
|
+
public function save_settings() {
|
|
342
|
+
// Verify nonce
|
|
343
|
+
if (!isset($_POST['scf_settings_nonce']) ||
|
|
344
|
+
!wp_verify_nonce($_POST['scf_settings_nonce'], 'simple_contact_form_settings')) {
|
|
345
|
+
wp_die(__('Security check failed', 'simple-contact-form'));
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// Check capability
|
|
349
|
+
if (!current_user_can('manage_options')) {
|
|
350
|
+
wp_die(__('Insufficient permissions', 'simple-contact-form'));
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Sanitize and save
|
|
354
|
+
if (isset($_POST['setting_value'])) {
|
|
355
|
+
$value = sanitize_text_field($_POST['setting_value']);
|
|
356
|
+
update_option('scf_setting', $value);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
**Audit findings**:
|
|
362
|
+
|
|
363
|
+
```bash
|
|
364
|
+
bd comment bd-sa.3 "Audit completed. Found 2 forms:
|
|
365
|
+
1. Settings form - MISSING nonce (CRITICAL)
|
|
366
|
+
2. Contact form - Has nonce ✓
|
|
367
|
+
|
|
368
|
+
Created remediation task for settings form."
|
|
369
|
+
bd close bd-sa.3
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
#### Task bd-sa.4: Audit AJAX Handlers for Nonce Verification
|
|
373
|
+
|
|
374
|
+
```bash
|
|
375
|
+
bd update bd-sa.4 --status in_progress
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
**Find all AJAX handlers**:
|
|
379
|
+
|
|
380
|
+
```bash
|
|
381
|
+
grep -r "wp_ajax" . --include="*.php"
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
**Check each handler**:
|
|
385
|
+
|
|
386
|
+
**File**: `includes/class-contact-form.php`
|
|
387
|
+
|
|
388
|
+
```php
|
|
389
|
+
// BEFORE (VULNERABLE)
|
|
390
|
+
public function handle_submission() {
|
|
391
|
+
$name = $_POST['name'];
|
|
392
|
+
$email = $_POST['email'];
|
|
393
|
+
// ... process submission
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// AFTER (SECURE)
|
|
397
|
+
public function handle_submission() {
|
|
398
|
+
// Verify nonce
|
|
399
|
+
if (!check_ajax_referer('simple_contact_form_nonce', 'nonce', false)) {
|
|
400
|
+
wp_send_json_error(array('message' => 'Security check failed'));
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Sanitize inputs
|
|
404
|
+
$name = sanitize_text_field($_POST['name']);
|
|
405
|
+
$email = sanitize_email($_POST['email']);
|
|
406
|
+
|
|
407
|
+
// ... process submission
|
|
408
|
+
}
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
**Check JavaScript nonce inclusion**:
|
|
412
|
+
|
|
413
|
+
**File**: `public/js/public.js`
|
|
414
|
+
|
|
415
|
+
```javascript
|
|
416
|
+
// BEFORE (VULNERABLE)
|
|
417
|
+
jQuery.ajax({
|
|
418
|
+
url: ajaxurl,
|
|
419
|
+
type: 'POST',
|
|
420
|
+
data: {
|
|
421
|
+
action: 'simple_contact_form_submit',
|
|
422
|
+
name: name,
|
|
423
|
+
email: email
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
// AFTER (SECURE)
|
|
428
|
+
jQuery.ajax({
|
|
429
|
+
url: scf_ajax.ajax_url,
|
|
430
|
+
type: 'POST',
|
|
431
|
+
data: {
|
|
432
|
+
action: 'simple_contact_form_submit',
|
|
433
|
+
nonce: scf_ajax.nonce, // Added nonce
|
|
434
|
+
name: name,
|
|
435
|
+
email: email
|
|
436
|
+
}
|
|
437
|
+
});
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
**Ensure nonce is localized**:
|
|
441
|
+
|
|
442
|
+
**File**: `public/class-public.php`
|
|
443
|
+
|
|
444
|
+
```php
|
|
445
|
+
public function enqueue_scripts() {
|
|
446
|
+
wp_enqueue_script('scf-public', plugin_dir_url(__FILE__) . 'js/public.js');
|
|
447
|
+
|
|
448
|
+
wp_localize_script('scf-public', 'scf_ajax', array(
|
|
449
|
+
'ajax_url' => admin_url('admin-ajax.php'),
|
|
450
|
+
'nonce' => wp_create_nonce('simple_contact_form_nonce')
|
|
451
|
+
));
|
|
452
|
+
}
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
```bash
|
|
456
|
+
bd comment bd-sa.4 "Audit completed. Found 1 AJAX handler:
|
|
457
|
+
1. Form submission handler - Has nonce verification ✓
|
|
458
|
+
|
|
459
|
+
All AJAX handlers properly secured."
|
|
460
|
+
bd close bd-sa.4
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
#### Task bd-sa.5: Audit Output for Escaping
|
|
464
|
+
|
|
465
|
+
```bash
|
|
466
|
+
bd update bd-sa.5 --status in_progress
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
**Find all echo/print statements**:
|
|
470
|
+
|
|
471
|
+
```bash
|
|
472
|
+
grep -rn "echo " . --include="*.php" | grep -v "esc_"
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
**Check each output**:
|
|
476
|
+
|
|
477
|
+
**File**: `admin/partials/messages-list.php`
|
|
478
|
+
|
|
479
|
+
```php
|
|
480
|
+
<!-- BEFORE (VULNERABLE) -->
|
|
481
|
+
<td><?php echo $message->name; ?></td>
|
|
482
|
+
<td><?php echo $message->email; ?></td>
|
|
483
|
+
<td><?php echo $message->message; ?></td>
|
|
484
|
+
|
|
485
|
+
<!-- AFTER (SECURE) -->
|
|
486
|
+
<td><?php echo esc_html($message->name); ?></td>
|
|
487
|
+
<td><?php echo esc_html($message->email); ?></td>
|
|
488
|
+
<td><?php echo esc_html($message->message); ?></td>
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
**URL escaping**:
|
|
492
|
+
|
|
493
|
+
```php
|
|
494
|
+
<!-- BEFORE (VULNERABLE) -->
|
|
495
|
+
<a href="<?php echo $delete_url; ?>">Delete</a>
|
|
496
|
+
|
|
497
|
+
<!-- AFTER (SECURE) -->
|
|
498
|
+
<a href="<?php echo esc_url($delete_url); ?>">Delete</a>
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
**Attribute escaping**:
|
|
502
|
+
|
|
503
|
+
```php
|
|
504
|
+
<!-- BEFORE (VULNERABLE) -->
|
|
505
|
+
<input type="text" value="<?php echo $value; ?>" />
|
|
506
|
+
|
|
507
|
+
<!-- AFTER (SECURE) -->
|
|
508
|
+
<input type="text" value="<?php echo esc_attr($value); ?>" />
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
```bash
|
|
512
|
+
bd comment bd-sa.5 "Audit completed. Found 12 unescaped outputs:
|
|
513
|
+
- 8 in admin messages list (HIGH)
|
|
514
|
+
- 3 in settings page (HIGH)
|
|
515
|
+
- 1 in email template (MEDIUM)
|
|
516
|
+
|
|
517
|
+
Created remediation tasks."
|
|
518
|
+
bd close bd-sa.5
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
#### Task bd-sa.7: Audit Database Queries
|
|
522
|
+
|
|
523
|
+
```bash
|
|
524
|
+
bd update bd-sa.7 --status in_progress
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
**Find all database queries**:
|
|
528
|
+
|
|
529
|
+
```bash
|
|
530
|
+
grep -rn "\$wpdb->" . --include="*.php"
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
**Check each query**:
|
|
534
|
+
|
|
535
|
+
**File**: `includes/class-contact-message.php`
|
|
536
|
+
|
|
537
|
+
```php
|
|
538
|
+
// BEFORE (VULNERABLE - SQL Injection)
|
|
539
|
+
public function get_by_email($email) {
|
|
540
|
+
global $wpdb;
|
|
541
|
+
$table = $wpdb->prefix . 'simple_contact_messages';
|
|
542
|
+
return $wpdb->get_results("SELECT * FROM $table WHERE email = '$email'");
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
// AFTER (SECURE)
|
|
546
|
+
public function get_by_email($email) {
|
|
547
|
+
global $wpdb;
|
|
548
|
+
$table = $wpdb->prefix . 'simple_contact_messages';
|
|
549
|
+
return $wpdb->get_results(
|
|
550
|
+
$wpdb->prepare("SELECT * FROM $table WHERE email = %s", $email)
|
|
551
|
+
);
|
|
552
|
+
}
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
**Check for correct placeholder types**:
|
|
556
|
+
|
|
557
|
+
```php
|
|
558
|
+
// CORRECT
|
|
559
|
+
$wpdb->prepare("SELECT * FROM $table WHERE id = %d", $id); // %d for integers
|
|
560
|
+
$wpdb->prepare("SELECT * FROM $table WHERE name = %s", $name); // %s for strings
|
|
561
|
+
$wpdb->prepare("SELECT * FROM $table WHERE price = %f", $price); // %f for floats
|
|
562
|
+
|
|
563
|
+
// INCORRECT
|
|
564
|
+
$wpdb->prepare("SELECT * FROM $table WHERE id = %s", $id); // Wrong type
|
|
565
|
+
$wpdb->prepare("SELECT * FROM $table WHERE id = '$id'"); // No placeholder
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
```bash
|
|
569
|
+
bd comment bd-sa.7 "Audit completed. Found 5 database queries:
|
|
570
|
+
- 2 using prepare() correctly ✓
|
|
571
|
+
- 3 missing prepare() (CRITICAL)
|
|
572
|
+
|
|
573
|
+
Created remediation task for unprepared queries."
|
|
574
|
+
bd close bd-sa.7
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
### Step 5: Remediation
|
|
578
|
+
|
|
579
|
+
#### Task bd-sa.10: Fix Critical Issues
|
|
580
|
+
|
|
581
|
+
```bash
|
|
582
|
+
bd ready # Shows bd-sa.10 is ready
|
|
583
|
+
bd update bd-sa.10 --status in_progress
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
**Critical issues to fix**:
|
|
587
|
+
|
|
588
|
+
1. ✅ Add nonce to settings form
|
|
589
|
+
2. ✅ Add nonce verification to settings handler
|
|
590
|
+
3. ✅ Add prepared statements to all database queries
|
|
591
|
+
|
|
592
|
+
**Implementation**:
|
|
593
|
+
|
|
594
|
+
```bash
|
|
595
|
+
# Fix settings form nonce
|
|
596
|
+
# Fix database queries with prepare()
|
|
597
|
+
# Test all fixes
|
|
598
|
+
```
|
|
599
|
+
|
|
600
|
+
```bash
|
|
601
|
+
bd comment bd-sa.10 "Fixed all 3 critical issues:
|
|
602
|
+
1. Added nonce to settings form
|
|
603
|
+
2. Added nonce verification to settings handler
|
|
604
|
+
3. Converted all database queries to use prepare()
|
|
605
|
+
|
|
606
|
+
All critical vulnerabilities resolved."
|
|
607
|
+
bd close bd-sa.10
|
|
608
|
+
```
|
|
609
|
+
|
|
610
|
+
### Step 6: Create Security Audit Report
|
|
611
|
+
|
|
612
|
+
#### Task bd-sa.14: Create Audit Report
|
|
613
|
+
|
|
614
|
+
```bash
|
|
615
|
+
bd update bd-sa.14 --status in_progress
|
|
616
|
+
```
|
|
617
|
+
|
|
618
|
+
**File**: `SECURITY-AUDIT-REPORT.md`
|
|
619
|
+
|
|
620
|
+
```markdown
|
|
621
|
+
# Security Audit Report: Simple Contact Form
|
|
622
|
+
|
|
623
|
+
**Date**: 2024-01-26
|
|
624
|
+
**Version**: 1.0.0
|
|
625
|
+
**Auditor**: AI Agent
|
|
626
|
+
|
|
627
|
+
## Executive Summary
|
|
628
|
+
|
|
629
|
+
Comprehensive security audit completed. All critical and high-severity issues have been resolved. Plugin is ready for WordPress.org submission.
|
|
630
|
+
|
|
631
|
+
## Findings Summary
|
|
632
|
+
|
|
633
|
+
| Severity | Found | Fixed | Remaining |
|
|
634
|
+
|----------|-------|-------|-----------|
|
|
635
|
+
| Critical | 3 | 3 | 0 |
|
|
636
|
+
| High | 12 | 12 | 0 |
|
|
637
|
+
| Medium | 1 | 1 | 0 |
|
|
638
|
+
| Low | 0 | 0 | 0 |
|
|
639
|
+
|
|
640
|
+
## Critical Issues (All Fixed)
|
|
641
|
+
|
|
642
|
+
### 1. Missing Nonce Verification in Settings Form
|
|
643
|
+
- **File**: `admin/partials/settings-page.php`
|
|
644
|
+
- **Issue**: Form submission without CSRF protection
|
|
645
|
+
- **Fix**: Added `wp_nonce_field()` and verification
|
|
646
|
+
- **Status**: ✅ Fixed
|
|
647
|
+
|
|
648
|
+
### 2. SQL Injection in Email Query
|
|
649
|
+
- **File**: `includes/class-contact-message.php`
|
|
650
|
+
- **Issue**: Direct variable insertion in SQL query
|
|
651
|
+
- **Fix**: Converted to `$wpdb->prepare()` with %s placeholder
|
|
652
|
+
- **Status**: ✅ Fixed
|
|
653
|
+
|
|
654
|
+
### 3. SQL Injection in Date Range Query
|
|
655
|
+
- **File**: `includes/class-contact-message.php`
|
|
656
|
+
- **Issue**: Unprepared query with user input
|
|
657
|
+
- **Fix**: Converted to `$wpdb->prepare()` with %s placeholders
|
|
658
|
+
- **Status**: ✅ Fixed
|
|
659
|
+
|
|
660
|
+
## High Issues (All Fixed)
|
|
661
|
+
|
|
662
|
+
### 4-15. Unescaped Output in Admin Pages
|
|
663
|
+
- **Files**: Various admin templates
|
|
664
|
+
- **Issue**: XSS vulnerability from unescaped user data
|
|
665
|
+
- **Fix**: Added appropriate escaping (`esc_html()`, `esc_attr()`, `esc_url()`)
|
|
666
|
+
- **Status**: ✅ Fixed (all 12 instances)
|
|
667
|
+
|
|
668
|
+
## Medium Issues (All Fixed)
|
|
669
|
+
|
|
670
|
+
### 16. Unescaped Output in Email Template
|
|
671
|
+
- **File**: `includes/class-email-handler.php`
|
|
672
|
+
- **Issue**: Potential XSS in email content
|
|
673
|
+
- **Fix**: Added `esc_html()` to email template
|
|
674
|
+
- **Status**: ✅ Fixed
|
|
675
|
+
|
|
676
|
+
## Security Checklist
|
|
677
|
+
|
|
678
|
+
- [x] All forms have nonce verification
|
|
679
|
+
- [x] All AJAX handlers verify nonces
|
|
680
|
+
- [x] All admin actions check capabilities
|
|
681
|
+
- [x] All user input is sanitized
|
|
682
|
+
- [x] All output is escaped
|
|
683
|
+
- [x] All database queries use prepared statements
|
|
684
|
+
- [x] No eval() or exec() usage
|
|
685
|
+
- [x] No unserialize() on user input
|
|
686
|
+
- [x] File uploads properly validated (N/A - no file uploads)
|
|
687
|
+
- [x] No external API calls without validation
|
|
688
|
+
|
|
689
|
+
## Recommendations
|
|
690
|
+
|
|
691
|
+
1. ✅ Implement rate limiting for form submissions (already implemented)
|
|
692
|
+
2. ✅ Add input validation for email addresses (already implemented)
|
|
693
|
+
3. ✅ Log security events (already implemented)
|
|
694
|
+
4. Consider adding honeypot field for spam prevention
|
|
695
|
+
5. Consider implementing reCAPTCHA for additional protection
|
|
696
|
+
|
|
697
|
+
## Conclusion
|
|
698
|
+
|
|
699
|
+
The Simple Contact Form plugin has passed comprehensive security audit. All critical and high-severity vulnerabilities have been resolved. The plugin follows WordPress security best practices and is ready for submission to WordPress.org.
|
|
700
|
+
```
|
|
701
|
+
|
|
702
|
+
```bash
|
|
703
|
+
bd comment bd-sa.14 "Created comprehensive security audit report. All issues documented and resolved."
|
|
704
|
+
bd close bd-sa.14
|
|
705
|
+
bd close bd-sa
|
|
706
|
+
```
|
|
707
|
+
|
|
708
|
+
## AI Agent Workflow
|
|
709
|
+
|
|
710
|
+
### Initial Prompt
|
|
711
|
+
|
|
712
|
+
```
|
|
713
|
+
Perform a comprehensive security audit on the Simple Contact Form plugin.
|
|
714
|
+
|
|
715
|
+
Audit scope:
|
|
716
|
+
- CSRF protection (nonces)
|
|
717
|
+
- XSS prevention (output escaping)
|
|
718
|
+
- SQL injection (prepared statements)
|
|
719
|
+
- Authorization (capability checks)
|
|
720
|
+
- Input validation and sanitization
|
|
721
|
+
|
|
722
|
+
Process:
|
|
723
|
+
1. Run automated scans (PHPCS with WordPress-VIP-Go)
|
|
724
|
+
2. Manual review of all forms, AJAX handlers, database queries, and output
|
|
725
|
+
3. Document all findings with severity ratings
|
|
726
|
+
4. Fix all critical and high-severity issues
|
|
727
|
+
5. Create security audit report
|
|
728
|
+
|
|
729
|
+
Provide detailed findings with file names, line numbers, and recommended fixes.
|
|
730
|
+
```
|
|
731
|
+
|
|
732
|
+
### Implementation Approach
|
|
733
|
+
|
|
734
|
+
1. **Create OpenSpec security audit spec** with requirements
|
|
735
|
+
2. **Break down into Beads tasks** for systematic review
|
|
736
|
+
3. **Run automated scans** to identify common issues
|
|
737
|
+
4. **Manual review** of critical security areas
|
|
738
|
+
5. **Prioritize remediation** (critical → high → medium → low)
|
|
739
|
+
6. **Fix all issues** with secure coding practices
|
|
740
|
+
7. **Document findings** in comprehensive report
|
|
741
|
+
8. **Verify fixes** with re-scan and testing
|
|
742
|
+
|
|
743
|
+
## Key Takeaways
|
|
744
|
+
|
|
745
|
+
- **Automated scanning** catches many issues but manual review is essential
|
|
746
|
+
- **Systematic approach** ensures no security areas are missed
|
|
747
|
+
- **Prioritization** focuses effort on critical vulnerabilities first
|
|
748
|
+
- **Documentation** provides audit trail and learning resource
|
|
749
|
+
- **WordPress security functions** (nonces, escaping, prepare) are mandatory
|
|
750
|
+
- **Security audit** should be performed before every release
|
|
751
|
+
- **Beads tracking** ensures all findings are addressed
|
|
752
|
+
|