Sample report
What an audit report looks like
The system is invented: the domain, addresses and numbers are made up. The findings are typical for a 1C-Bitrix online shop on two servers. A real report has the same structure and stays with you even if you go no further.
- Site
- shop.example.com
- Stack
- 1C-Bitrix, PHP 8.1, MySQL 8
- Servers
- 2 dedicated, CDN in front
- Audit took
- 5 working days
In short
Three findings can cost money today: the customer database downloads from a direct link, the server answers around the CDN, and backups sit on the same disk and have never been restored. The catalogue answers in 2.8 seconds under load, and almost all of that is server settings, not code. The fix is $1800 and two weeks; the first two findings are closed on the day it is signed.
01
Findings — ordered by what they could cost
A database dump is downloadable from the internet
- What we saw
- /backup/db_2026-10-01.sql.gz, 1.4 GB, sits in the web root and is served without authentication.
- What it risks
- A leak of the customer base: phone numbers, addresses, order history — and the regulatory exposure that comes with it.
- Fix
- Config change: remove the file, refuse archives and dumps at the nginx level.
- Effort
- An hour, on the day of signing
Check it yourself · 01 $ curl -sI https://shop.example.com/backup/db_2026-10-01.sql.gz HTTP/2 200 content-length: 1503238553The server answers around the CDN
- What we saw
- The backend address is found through a stale DNS record, mail.shop.example.com, and it accepts site requests directly.
- What it risks
- The CDN's DDoS protection and filtering do nothing: an attacker only needs the address.
- Fix
- Config change: allow 443 from CDN addresses only, drop the record, move mail to its own address.
- Effort
- Half a day
Check it yourself · 02 $ curl -sI --resolve shop.example.com:443:203.0.113.20 \ https://shop.example.com/ HTTP/2 200Backups on the same disk, never restored
- What we saw
- A nightly script writes a site and database archive to /var/backups on the same server. The last 3 copies are kept.
- What it risks
- A disk failure, ransomware or an admin mistake takes the site and every copy at once.
- Fix
- Rebuild: restic to S3 at a different provider, encrypted, 30 days retention, a monthly restore drill.
- Effort
- Two days
Catalogue: p95 of 2.8 seconds under load
- What we saw
- At 20 requests per second the catalogue p95 TTFB is 2.8 s. The 128 MB OPcache is full and keeps resetting; three catalogue components have caching off; the filter query takes 1.2 s without an index.
- What it risks
- A slow catalogue means fewer orders and worse search rankings. During a sale the site hits its ceiling before the ads do.
- Fix
- Config change: 512 MB OPcache, component caching, an index for the filter. Target: p95 under 600 ms at the same load.
- Effort
- Three days, measured before and after
Check it yourself · 04 $ php -r "print_r(opcache_get_status()['memory_usage']);" [used_memory] => 134217728 [free_memory] => 0PHP-FPM: 5 workers on a 16 GB server
- What we saw
- pm.max_children = 5, the default. Under load requests queue while memory sits at 30%.
- What it risks
- The site is slow with resources to spare: the sixth concurrent shopper waits.
- Fix
- Config change: a pool sized to the real per-process memory, and the PHP slow log on.
- Effort
- Part of the catalogue work
The admin panel is open to the whole internet
- What we saw
- /bitrix/admin/ is reachable from anywhere, two-factor login is off, and the log shows password guessing.
- What it risks
- One guessed manager password is full access to the shop and its database.
- Fix
- Config change: admin reachable only from the private network or an address list, 2FA, brute-force blocking.
- Effort
- Half a day
Two modules with published vulnerabilities
- What we saw
- The core and two third-party modules have not been updated in over a year; both modules have public vulnerability write-ups.
- What it risks
- The standard way shops get broken into: a known hole in a module nobody updates.
- Fix
- Update on staging, check ordering and payment, roll out in a window. Where no update exists — a WAF rule on the vulnerable path.
- Effort
- Two days
Order emails land in spam
- What we saw
- SPF exceeds the 10 DNS lookup limit, there is no DKIM signature, and no DMARC record.
- What it risks
- The customer never sees the order confirmation and writes to support — or does not come back.
- Fix
- Config change: SPF within the limit, DKIM, DMARC with reports; transactional mail from its own domain.
- Effort
- A day
TLS and certificates
- What we saw
- TLS 1.2 and 1.3, modern cipher suites, certificates renew automatically.
- What it risks
- None.
- Fix
- Leave as is.
- Effort
- —
02
The server bill
The second server runs at 15% and only hosts cron jobs. They can move to the first, and the second can be replaced by a smaller machine for a database replica — roughly 40% off that line of the bill. This is a recommendation, not part of the fix: your call.
03
Price and timeline for the fix
- Config changes (findings 1, 2, 4, 5, 6, 8)
- $1050
- Backup rebuild (3)
- $400
- Module updates (7)
- $350
- Total, fixed
- $1800
- Timeline
- Two weeks
The price is named in the report and does not move during the work. You can take part of the list — then only the chosen lines count.
Your report will be about your system: different findings, a different order, a different number. The form is this one.