Files
vidok.com/.paul/codebase/concerns.md
Jacek Pyziak cf1a0adb0b docs: map existing codebase
- 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>
2026-05-05 22:02:04 +02:00

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 in ajax.php, admin/ajax.php, admin/index.php, download.php, api/contact_map.php, index.php
  • Current mitigation: None
  • Fix: Move to .env file, add .env to .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_settings entry

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'] before readfile())
  • 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:19domain parameter in raw SQL
    • autoload/admin/factory/class.Pages.php:353lang variable in raw SQL
    • autoload/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.php used for dev and production; no .env pattern
  • Files: config.php and all entry points that require it
  • Impact: Credentials hardcoded, can't safely commit config, no staging/prod separation
  • Fix: Adopt .env pattern with vlucas/phpdotenv or 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.php is 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_provinces table 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/ to templates/ — easy to edit wrong file
  • Common failures: Edit templates/ file thinking it's active, but templates_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 .env loading at top of config.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