DokuWiki/PHP Security Checklist

Version: 2.0
Scope: DokuWiki plugin development and PHP-specific security hardening.

This section extends the common checklist for DokuWiki plugin development.

PHP-Specific Security

Check CWE Description Solution
[ ] XSS Prevention CWE-79 User input in HTML output hsc(), htmlspecialchars()
[ ] SQL Injection CWE-89 Database queries DokuWiki DB abstraction, prepared statements
[ ] Path Traversal CWE-22 File path manipulation cleanID(), resolve_id()
[ ] CSRF Protection CWE-352 Form submissions getSecurityToken(), checkSecurityToken()
[ ] Command Injection CWE-78 Shell commands Avoid exec(), shell_exec(), system()
[ ] File Upload CWE-434 Malicious file uploads MIME validation, extension whitelist
[ ] Open Redirect CWE-601 URL redirects Whitelist allowed domains
[ ] Session Fixation CWE-384 Session handling DokuWiki session management

DokuWiki Input Handling

Function Purpose When to Use
hsc($str) HTML escape All user input in HTML
$INPUT→str('param') Safe GET/POST string Form parameters
$INPUT→int('param') Safe integer input Numeric parameters
$INPUT→arr('param') Safe array input Array parameters
cleanID($id) Sanitize page ID Wiki page references
resolve_id($ns, $id) Resolve relative ID Namespace resolution

DokuWiki Output Encoding

// CORRECT - Always escape user input
echo '<div>' . hsc($userInput) . '</div>';
 
// WRONG - XSS vulnerability!
echo '<div>' . $userInput . '</div>';
 
// CORRECT - Attribute escaping
echo '<a href="' . hsc($url) . '">' . hsc($text) . '</a>';
 
// CORRECT - JavaScript context
echo '<script>var data = ' . json_encode($data, JSON_HEX_TAG) . ';</script>';

DokuWiki Plugin Structure

Check Description
[ ] plugin.info.txt exists Plugin metadata
[ ] @license header in all PHP files GPL 2 or compatible
[ ] @author header with email Attribution
[ ] Uses $this→getLang() Localization
[ ] Uses DokuWiki events Extensibility
[ ] No direct $_GET/'$_POST access | Use $INPUT object | | [ ] No direct file writes | Use DokuWiki APIs | ===== DokuWiki Security Audit Checklist ===== ^ Check ^ CWE ^ PHP Code Pattern to Find ^ | [ ] XSS in echo | CWE-79 | echo $var without hsc() | | [ ] XSS in print | CWE-79 | print $var without hsc() | | [ ] Direct $_GET | CWE-20 | $_GET['param'] | | [ ] Direct $_POST | CWE-20 | $_POST['param'] | | [ ] Direct $_REQUEST | CWE-20 | $_REQUEST['param'] | | [ ] SQL concat | CWE-89 | „SELECT * FROM “ . $var | | [ ] Shell exec | CWE-78 | exec(), shell_exec(), system(), backticks | | [ ] File include | CWE-98 | include($var), require($var) | | [ ] Unvalidated redirect | CWE-601 | header(„Location: “ . $var) | | [ ] Eval | CWE-94 | eval($var) | | [ ] Preg with e modifier | CWE-94 | preg_replace('/…$/e', …) (deprecated) | ===== DokuWiki Security Functions Reference ===== ^ Function ^ Purpose ^ CWE Prevented ^ | hsc() | HTML special chars | CWE-79 (XSS) | | cleanID() | Clean page ID | CWE-22 (Path Traversal) | | resolve_id() | Resolve page ID | CWE-22 (Path Traversal) | | getSecurityToken() | Get CSRF token | CWE-352 (CSRF) | | checkSecurityToken() | Verify CSRF token | CWE-352 (CSRF) | | auth_quickaclcheck() | Check permissions | CWE-862 (Missing Auth) | | $INPUT→str() | Safe string input | CWE-20 (Input Validation) | | $INPUT→int()'' Safe integer input CWE-20 (Input Validation)

<wvds:audit:template> plugin.info.txt exists @license header in all PHP files @author header with email No direct $_GET/$_POST access XSS prevention (hsc() used) </wvds:audit:template>


Version: 2.0 (Split)
Author: Wolfgang van der Stille

Back to Stack Checklists | Review Checklists

Zuletzt geändert: on 2026/01/08 at 04:47 AM