- stack.md (68 lines) - PHP/MySQL/Apache stack, vendored libraries - architecture.md (131 lines) - Custom MVC CMS, dual-layer (front/admin) - structure.md (170 lines) - Directory layout and conventions - conventions.md (98 lines) - PHP snake_case, SCSS $c/$f prefixes, jQuery patterns - testing.md (49 lines) - No automated tests detected - integrations.md (111 lines) - Google Maps, PHPMailer, Pixieset, Facebook - concerns.md (150 lines) - Critical security issues: hardcoded creds, MD5, unserialize - db_schema.md (260 lines) - ~32 tables with pp_ prefix, inferred from source - tech_changelog.md (9 lines) - Initial log entry Co-Authored-By: Claude <noreply@anthropic.com>
9.2 KiB
Codebase Concerns
Analysis Date: 2026-05-05
Security Considerations
Hardcoded database credentials in version control:
- Risk: Database password and host exposed in repository; any repo access = DB access
- Files:
config.php(primary), also required inajax.php,admin/ajax.php,admin/index.php,download.php,api/contact_map.php,index.php - Current mitigation: None
- Fix: Move to
.envfile, add.envto.gitignore, create.env.example
Hardcoded Google reCAPTCHA secret key:
- Risk: Secret key
6Lfaovgl...hardcoded and repeated 8 times in one file - Files:
plugins/special-actions-middle.php(lines ~242, 296, 453, 531, 602, 679, 745) - Current mitigation: None
- Fix: Move to config/settings, extract to single constant or
pp_settingsentry
MD5 password hashing:
- Risk: MD5 is cryptographically broken — rainbow table attacks trivial
- Files:
autoload/admin/factory/class.Users.php,autoload/admin/class.Site.php - Current mitigation: None
- Fix: Replace with
password_hash()(bcrypt) +password_verify()
PHP object injection via unserialize() on cookie data:
- Risk: Attacker-controlled cookie triggers PHP object injection / RCE
- Files:
admin/ajax/pages.php(unserialize($_COOKIE['cookie_menus']),unserialize($_COOKIE['cookie_pages'])) - Also in:
admin/templates/articles/article-edit.php,admin/templates/layouts/layout-edit.php,admin/templates/pages/pages-list.php,admin/templates/pages/pages-browse-list.php - Current mitigation: None
- Fix: Replace with
json_decode()for cookie state storage
Path traversal in file download:
- Risk: Arbitrary file read — attacker can request any file on server
- Files:
get_file.php(no validation on$_GET['fileUrl']beforereadfile()) - Current mitigation: None
- Fix: Whitelist allowed paths, validate against upload directory only
File upload without MIME type validation:
- Risk: Executable files (
.php) may be uploaded with double extension bypass - Files:
plugins/special-actions-middle.php(lines ~313-316,move_uploaded_file()with unsanitized$_FILES['files']['name']) - Current mitigation: Extension check only (bypassable)
- Fix: Validate MIME type via
finfo_file(), restrict upload directory execution, add file size limits
SQL injection risk via string concatenation:
- Risk: Direct variable injection into SQL strings (not all queries use Medoo parameterization)
- Files:
autoload/front/factory/class.Languages.php:19—domainparameter in raw SQLautoload/admin/factory/class.Pages.php:353—langvariable in raw SQLautoload/admin/factory/class.Articles.php:149,163,181— multiple concatenations
- Current mitigation: Medoo handles most queries safely; raw SQL in edge cases
- Fix: Replace raw SQL with Medoo parameterized queries throughout
User input echoed without htmlspecialchars():
- Risk: XSS (Cross-Site Scripting) in email confirmations and form outputs
- Files:
ajax.php:64,82-84,plugins/special-actions-middle.php:253-256 - Current mitigation: None
- Fix: Apply
htmlspecialchars($value, ENT_QUOTES)before output
Tech Debt
No environment configuration separation:
- Issue: Single
config.phpused for dev and production; no.envpattern - Files:
config.phpand all entry points that require it - Impact: Credentials hardcoded, can't safely commit config, no staging/prod separation
- Fix: Adopt
.envpattern withvlucas/phpdotenvor equivalent
God object class.S.php:
- Issue: 1328-line class handling images, caching, sessions, email, DB utilities — no single responsibility
- Files:
autoload/class.S.php - Impact: Hard to test, hard to modify, used everywhere so any bug is widespread
- Fix: Gradually extract into dedicated service classes (
ImageService,CacheService,EmailService)
Duplicate reCAPTCHA verification logic:
- Issue: reCAPTCHA verification code copy-pasted 8+ times instead of a shared function
- Files:
plugins/special-actions-middle.php(lines 230-809, repeated blocks) - Impact: Any bug fix requires 8 changes; any key rotation requires 8 updates
- Fix: Extract to
verify_recaptcha($response)function called once per form
Error suppression instead of error handling:
- Issue:
error_reporting(0)silences all errors; no logging to file or monitoring - Files:
admin/ajax.php:2,admin/index.php:14 - Impact: Silent failures, impossible to debug production issues
- Fix: Implement proper error logging (
error_log()or PSR-3 logger), use try/catch in DB operations
Mixed concerns in templates:
- Issue: Business logic and data manipulation embedded in template PHP files
- Files:
admin/templates/articles/article-edit.php(1143 lines),admin/templates/pages/page-edit.php - Impact: Hard to maintain, duplicate logic between templates and factory classes
- Fix: Move all logic to controls/factory, pass pre-computed variables to templates
Deprecated function usage:
- Issue:
mime_content_type()deprecated since PHP 5.3 - Files:
autoload/class.S.php:37 - Fix: Replace with
finfo_file()
Performance Bottlenecks
Large data file loaded at runtime:
- Problem:
wojewodztwa.phpis 6548 lines of PHP arrays — loaded entirely for any request needing province data - Files:
wojewodztwa.php - Cause: Static data embedded in PHP instead of database or JSON
- Fix: Move to
pp_provincestable or JSON file with lazy loading
Template placeholder replacement:
- Problem: Layout HTML scanned for all placeholder patterns on every page request
- Files:
autoload/front/view/class.Site.php - Cause: String replacement for
[MENU:id],[ARTYKULY:id], etc. on each render - Improvement: Page caching (already implemented as opt-in, ensure enabled for high-traffic pages)
WebP image generation:
- Problem: WebP conversion happens on-demand per request (not pre-generated)
- Files:
autoload/class.Image.php,autoload/class.S.php - Cause: No background job system for image processing
- Impact: First request for each image is slow; cache/ fills over time
- Improvement: Pre-generate WebP on upload
Fragile Areas
Plugin hook file special-actions-middle.php:
- Files:
plugins/special-actions-middle.php(very large file with 8+ contact form handlers) - Why fragile: Monolithic — all contact forms, reCAPTCHA, file uploads in one file; no shared validation
- Common failures: Adding a new form variant requires duplicating entire handler block
- Safe modification: Extract shared validation/email logic before adding new variants
Template override system:
- Files:
autoload/class.Tpl.php,templates/,templates_user/ - Why fragile: Silent fallback from
templates_user/totemplates/— easy to edit wrong file - Common failures: Edit
templates/file thinking it's active, buttemplates_user/override takes precedence - Safe modification: Always check both directories;
templates_user/takes precedence
Admin session / cookie auto-login:
- Files:
admin/index.php(lines 36-84) - Why fragile: IP-based session validation can lock out admin on IP change; cookie auto-login not encrypted
- Common failures: Admin locked out after ISP IP change
- Safe modification: Test login flow after any changes to session handling
Dependencies at Risk
jQuery 1.11.1 (admin panel):
- Risk: EOL since 2016; known XSS vulnerabilities
- Impact: Admin panel DOM manipulation, CKEditor compatibility
- Files:
admin/templates/site/main-layout.php - Migration: Upgrade to jQuery 3.x (breaking changes in
.live(),.size()etc.)
CKEditor (version unknown):
- Risk: Older CKEditor 4.x versions have known XSS vulnerabilities
- Files:
libraries/ckeditor/ - Migration: Audit version, update to latest CKEditor 4 LTS or migrate to CKEditor 5
Medoo (version unknown, likely 1.x):
- Risk: Medoo 1.x API differs significantly from 2.x; unmaintained in 1.x branch
- Files:
libraries/medoo/medoo.php - Migration: Audit API usage before upgrading to Medoo 2.x
Missing Critical Features
No environment configuration:
- Problem: No way to run app locally without overwriting production credentials
- Blocks: Safe local development, CI/CD setup, multi-developer workflow
- Complexity: Low — add
.envloading at top ofconfig.php
No error logging / monitoring:
- Problem: Production errors are silently swallowed
- Blocks: Debugging production issues, alerting on failures
- Complexity: Low — configure
error_log()to file + optional email alert
No CSRF protection:
- Problem: All forms lack CSRF token validation
- Blocks: Prevents CSRF attacks on contact/newsletter/admin forms
- Complexity: Medium — add token generation + validation middleware
No automated tests:
- Problem: Zero test coverage — no regression safety net for changes
- Blocks: Refactoring, safe dependency upgrades, CI/CD
- Complexity: High — requires setting up PHPUnit, test DB, writing tests from scratch
Test Coverage Gaps
Entire codebase:
- What's not tested: Everything — factory methods, controls, views, AJAX handlers
- Risk: Any change could break functionality silently
- Priority: High for security-sensitive paths (auth, file uploads, SQL queries)
- Difficulty: High — no test infrastructure exists; factory methods use static Medoo instance
Concerns audit: 2026-05-05 Update as issues are fixed or new ones discovered