Security report for
budgetpixels.nl
Scanned 4 hours ago
Executive Summary
We performed a comprehensive security analysis of budgetpixels.nl across 20 categories. The website received an overall score of 72/100 (grade B-), with 6 critical issues, 27 warnings, and 75 passed checks.
Overall assessment: budgetpixels.nl has a reasonable security foundation but there is clear room for improvement. Several issues were identified that could expose the website or its users to unnecessary risk. We recommend addressing the critical issues first, followed by the warnings outlined below.
Top priority fixes:
Strong areas
TLS / Cipher
Robots & Sitemap
Content & CMS
Performance & SEO
API Security
Needs improvement
SSL & HTTPS
OWASP Top 10
Branding & Social
Email Security
Needs work
Security Headers
Session Security
DNS & Email Security
Website Health Check
Simple overview for everyoneIs my website safe for visitors?
Not fully — your website is missing important security protections that keep visitors safe.
Can my website be found by Google?
Yes — your website is accessible to search engines and loads at a reasonable speed.
Is my email protected against spoofing?
Not fully — attackers could send fake emails pretending to be from your domain. This is used in phishing attacks.
Is my website leaking sensitive data?
No leaks detected — configuration files and sensitive data appear to be properly protected.
Does my website respect visitor privacy?
Yes — a privacy policy and cookie consent appear to be in place.
This website is probably trustworthy
Domain Registration (WHOIS)
Security Database Checks
Domain has been registered for 8 months (since 20 Jul 2025).
Could not retrieve Quad9 classification for this domain.
DNSFilter has not flagged this domain — no known threats detected.
Domain is not listed in the APWG phishing and malware database.
Malware & Virus Scan
CleanWhat is this?
URLhaus is a database maintained by abuse.ch that tracks URLs and domains used to distribute malware — exploit kits, ransomware droppers, banking trojans, and other malicious software. It is one of the most comprehensive active malware distribution blocklists.
Why does it matter?
A listing in URLhaus means this domain has been observed actively distributing malware to visitors. This could mean your website has been hacked and is serving malicious files, or that your domain was registered specifically for malware distribution.
How to fix it
1. Scan your website files for malware: - Use a hosting panel malware scanner (cPanel/Imunify360) - Use Wordfence (WordPress) or a server-side scanner like ClamAV - Check recently modified files: find /var/www -newer /tmp/ref -type f 2. Check access logs for suspicious uploads or requests 3. Change all passwords (FTP, hosting, CMS admin, database) 4. Request removal from URLhaus: Visit urlhaus.abuse.ch and submit a takedown request once your site is clean
What is this?
Cloudflare's Security DNS (1.1.1.2) is a public DNS resolver that automatically blocks domains known to distribute malware, ransomware, and phishing content. When a DNS query returns NXDOMAIN (domain not found) from the security resolver but the domain resolves normally on regular DNS, the domain is being blocked.
Why does it matter?
Being blocked by Cloudflare's security resolver means the domain has been identified as harmful by Cloudflare's threat intelligence. This actively protects millions of internet users from visiting the site, and indicates the domain has been reported or detected as malicious.
How to fix it
If your site is incorrectly blocked: 1. Check if your site has been hacked and clean any malware 2. Submit a false positive report to Cloudflare via their security portal 3. Check other threat databases (VirusTotal, URLhaus) for listings If the block is justified: 1. Clean all malware from your server 2. Change all credentials 3. Request removal from Cloudflare's threat database
What is this?
Spamhaus ZEN is a combined IP blocklist maintained by The Spamhaus Project, one of the most authoritative anti-spam and anti-malware organizations. ZEN combines SBL (spam sources), XBL (compromised/infected machines), and CBL (botnet command & control).
Why does it matter?
An IP listed in the SBL or XBL zones indicates the server has been identified as sending spam, hosting malware, or being infected by a botnet. This can cause legitimate emails from the server to be rejected by mail providers worldwide.
How to fix it
1. Check which Spamhaus list the IP is on: Visit check.spamhaus.org and enter your IP 2. If listed in SBL (spam source): - Find and remove the software or account sending spam - Check for compromised email accounts - Submit a removal request at spamhaus.org 3. If listed in XBL (compromised machine): - Your server may have malware or be part of a botnet - Run a full malware scan - Check for unauthorized processes: ps aux - Consider rebuilding the server if compromise is confirmed
Open Ports
3 dangerous ports openWhat is this?
Port 21 is used by FTP (File Transfer Protocol), which lets you upload and download files to your server. FTP was designed in the early internet era before encryption existed.
Why does it matter?
FTP sends your username, password, and all transferred files in complete plaintext over the network. Anyone intercepting the connection — on the same network or via a man-in-the-middle attack — can read your credentials and every file you transfer.
How to fix it
Disable FTP and switch to SFTP (SSH File Transfer Protocol), which uses the same SSH encryption as terminal access: For FileZilla: connect using protocol SFTP and your SSH credentials. To disable pure FTP (Ubuntu): sudo systemctl stop vsftpd sudo systemctl disable vsftpd If FTP is absolutely required, use FTPS (FTP over TLS) instead of plain FTP.
What is this?
Port 22 is used by SSH (Secure Shell), the standard encrypted protocol for remote server access. It lets administrators log in to the server and run commands remotely.
Why does it matter?
SSH itself is secure, but an open SSH port is a constant target for brute-force attacks — bots continuously try thousands of username/password combinations. If password authentication is enabled, a weak password can lead to full server compromise.
How to fix it
Disable password authentication and use SSH keys only: Edit /etc/ssh/sshd_config: PasswordAuthentication no PubkeyAuthentication yes Then restart SSH: sudo systemctl restart sshd Optional: move SSH to a non-standard port (e.g. 2222) to reduce bot noise: Port 2222 Optional: use fail2ban to automatically block IPs with too many failed attempts: sudo apt install fail2ban
What is this?
Port 23 is used by Telnet, a very old remote access protocol from the 1960s. Like FTP, it was designed before encryption existed.
Why does it matter?
Telnet transmits everything — including your login credentials and every command you run — in complete plaintext. Anyone intercepting the connection sees exactly what you type. There is no situation where Telnet is preferable over SSH on a modern server.
How to fix it
Disable and remove Telnet: sudo systemctl stop telnet sudo systemctl disable telnet sudo apt remove telnetd # Ubuntu/Debian If port 23 is still open after removing Telnet, check what process is using it: sudo ss -tlnp | grep :23 Use SSH for all remote access. SSH provides the same functionality with full encryption.
What is this?
Port 3306 is the default port for MySQL (and MariaDB), the database server that stores your website's content, user accounts, orders, and all other data.
Why does it matter?
Exposing the MySQL port to the internet allows attackers to directly attempt to log in to your database using brute force or stolen credentials. If they succeed, they have full access to all your data without needing to compromise the website itself.
How to fix it
Block the port with a firewall (UFW on Ubuntu): sudo ufw deny 3306/tcp Or restrict to only your app server IP: sudo ufw allow from YOUR_APP_IP to any port 3306 Also bind MySQL to localhost in /etc/mysql/mysql.conf.d/mysqld.cnf: bind-address = 127.0.0.1 Then restart MySQL: sudo systemctl restart mysql For remote DB management, use an SSH tunnel instead: ssh -L 3306:127.0.0.1:3306 user@yourserver
What is this?
Port 5432 is the default port for PostgreSQL, an advanced open-source relational database. Like MySQL, it stores all application data.
Why does it matter?
A publicly reachable PostgreSQL port exposes the database directly to brute-force attacks. PostgreSQL also has a history of being exploited when authentication is misconfigured (e.g. trust authentication).
How to fix it
Block with UFW: sudo ufw deny 5432/tcp Bind PostgreSQL to localhost in /etc/postgresql/*/main/postgresql.conf: listen_addresses = 'localhost' Restart PostgreSQL: sudo systemctl restart postgresql For remote access, use an SSH tunnel: ssh -L 5432:127.0.0.1:5432 user@yourserver
What is this?
Port 6379 is the default port for Redis, an in-memory data store commonly used for caching, session storage, and queues. Redis has no authentication by default.
Why does it matter?
An exposed Redis instance is one of the most dangerous vulnerabilities a server can have. Attackers can read all cached data (including user sessions), write arbitrary data, use Redis's replication feature to write SSH keys to the server and gain root access, or abuse it for DDoS amplification.
How to fix it
Block with UFW immediately: sudo ufw deny 6379/tcp Bind Redis to localhost in /etc/redis/redis.conf: bind 127.0.0.1 Enable a strong password: requirepass YourStrongPasswordHere Restart Redis: sudo systemctl restart redis If Redis must be reachable from another server, use an SSH tunnel or VPN — never expose it directly.
What is this?
Port 27017 is the default port for MongoDB, a NoSQL document database. MongoDB stores data as JSON-like documents and is popular for modern web applications.
Why does it matter?
Hundreds of thousands of MongoDB databases have been wiped by automated attacks — attackers delete all data and leave a ransom note demanding Bitcoin. This happened because many MongoDB installations were publicly accessible with no authentication enabled.
How to fix it
Block with UFW: sudo ufw deny 27017/tcp Bind to localhost in /etc/mongod.conf: net: bindIp: 127.0.0.1 Enable authentication: security: authorization: enabled Restart MongoDB: sudo systemctl restart mongod
What is this?
Port 9200 is the default HTTP API port for Elasticsearch, a search and analytics engine. It provides a full REST API for querying and managing data.
Why does it matter?
Elasticsearch has no authentication by default. An exposed port gives anyone full read/write access to all indexed data via simple HTTP requests. Exposed Elasticsearch has caused massive data breaches affecting billions of records (medical data, voter records, financial data).
How to fix it
Block with UFW: sudo ufw deny 9200/tcp sudo ufw deny 9300/tcp # cluster port Bind to localhost in elasticsearch.yml: network.host: 127.0.0.1 If using Elastic Cloud or a paid licence, enable X-Pack security: xpack.security.enabled: true Restart Elasticsearch: sudo systemctl restart elasticsearch
What is this?
Port 11211 is the default port for Memcached, an in-memory caching system used to speed up web applications by storing frequently accessed data.
Why does it matter?
Memcached has no authentication. An exposed instance lets anyone read or manipulate your cache. It is also heavily abused for DDoS amplification attacks — attackers send small spoofed requests to Memcached which generates much larger responses, overwhelming the victim.
How to fix it
Block with UFW: sudo ufw deny 11211/tcp Bind to localhost when starting Memcached (in /etc/memcached.conf): -l 127.0.0.1 Restart Memcached: sudo systemctl restart memcached
What is this?
Port 25 is used by SMTP (Simple Mail Transfer Protocol), the standard protocol for sending email between mail servers. It is expected to be open on dedicated mail servers.
Why does it matter?
If this server is not a mail server, an open SMTP port may indicate an unauthorised mail relay or spam-sending software. Open relays — SMTP servers that accept and forward email from anyone — are exploited by spammers to send bulk email through your server, leading to IP blacklisting.
How to fix it
If this server does not send email: sudo ufw deny 25/tcp If this server runs a mail server (Postfix, Exim, Sendmail): 1. Verify it is not configured as an open relay: telnet localhost 25 EHLO test MAIL FROM: test@external.com RCPT TO: test@another-external.com (should be rejected) 2. Keep your MTA updated and monitor /var/log/mail.log for unusual sending patterns.
What is this?
Port 2375 is the Docker daemon's unencrypted TCP API port. When enabled, it allows remote control of all Docker containers on the server without any authentication.
Why does it matter?
Access to the Docker API without TLS is equivalent to root access to the entire server. An attacker can create a privileged container that mounts the host filesystem, read and modify any file on the server, install backdoors, exfiltrate all data, or pivot to other systems on the network. This is one of the most critical misconfigurations possible.
How to fix it
Close port 2375 immediately: sudo ufw deny 2375/tcp Do NOT expose the Docker daemon over TCP without mutual TLS. Use the Unix socket instead for local access: /var/run/docker.sock If remote Docker API access is needed, use SSH tunneling: ssh -L 2375:localhost:2375 user@server Or configure Docker with TLS client certificates (docker --tlsverify). Check if it was intentionally opened: sudo systemctl cat docker | grep -i tcp
What is this?
Port 8080 is a common alternative HTTP port, often used for development servers, admin panels, reverse proxies (Nginx/Apache behind an app server), or Java application servers like Tomcat.
Why does it matter?
An open port 8080 may expose an admin interface, development build, or staging server that was not intended to be publicly accessible. Development environments often have weaker security settings, disabled authentication, or verbose error messages that reveal internal architecture.
How to fix it
Identify what is running on port 8080: sudo ss -tlnp | grep :8080 If it is a development server or admin panel, restrict access to trusted IPs: sudo ufw allow from YOUR_IP to any port 8080 sudo ufw deny 8080/tcp If it is a legitimate proxy or app server, ensure it has authentication enabled and is not exposing internal diagnostic pages.
What is this?
Port 8443 is a common alternative HTTPS port. It is frequently used for admin panels, development environments, application servers, or services that cannot use the standard port 443.
Why does it matter?
Like port 8080, an open 8443 may expose admin interfaces or staging environments. Even with HTTPS, a self-signed certificate or misconfigured service on this port can be a security concern if it provides access to sensitive functionality without proper authentication.
How to fix it
Identify what is running on port 8443: sudo ss -tlnp | grep :8443 If it is an admin panel or dev interface, restrict to trusted IPs: sudo ufw allow from YOUR_IP to any port 8443 sudo ufw deny 8443/tcp Ensure any service on this port uses a valid SSL certificate and has proper authentication enabled.
Privacy & GDPR
What is this?
A cookie consent banner is a notice that informs visitors about cookie usage and asks for their consent before non-essential cookies (analytics, marketing, advertising) are set. Under GDPR (EU), PECR (UK), and similar laws, this consent must be freely given, specific, and informed.
Why does it matter?
The GDPR (General Data Protection Regulation) requires explicit consent before setting non-essential cookies. Violations can result in fines of up to €20 million or 4% of global annual turnover. Beyond legal requirements, it builds user trust and demonstrates transparency.
How to fix it
Use a consent management platform (CMP): Free options: - CookieYes (cookieyes.com) — free tier available - Osano (osano.com) — free for small sites - Cookie Consent by Osano (open source) Premium/advanced: - Cookiebot - OneTrust - Usercentrics For WordPress: install a GDPR consent plugin (e.g. Complianz, CookieYes plugin) Ensure your banner: - Does NOT pre-tick consent boxes - Makes 'Reject all' as easy as 'Accept all' - Lists exactly which cookies are used and why
What is this?
A privacy policy is a legal document that explains what personal data you collect from users, why you collect it, how it is used, who it is shared with, and how users can request deletion or access to their data.
Why does it matter?
A privacy policy is legally required in most jurisdictions: GDPR (EU/EEA), CCPA (California), LGPD (Brazil), PIPEDA (Canada), and more. Without one, you risk regulatory fines, loss of payment processor accounts (Stripe/PayPal require it), removal from ad platforms, and loss of user trust.
How to fix it
Create a privacy policy and link to it in your footer. Free generators: - TermsFeed (termsfeed.com) - Iubenda (iubenda.com) — free tier - GetTerms (getterms.io) Your policy must cover: 1. What data you collect (name, email, IP, cookies, etc.) 2. Why you collect it (legal basis under GDPR) 3. Who you share it with (hosting, analytics, payment processors) 4. How long you keep it 5. User rights (access, deletion, portability) 6. Contact information for a data protection officer or contact Update it whenever you add new services or change data practices.
What is this?
Tracking scripts are third-party JavaScript snippets embedded in your website that collect data about visitor behaviour — pages visited, time spent, clicks, demographics, purchases, and more. Common examples are Google Analytics, Meta Pixel (Facebook), and Hotjar.
Why does it matter?
Under GDPR, tracking scripts that process personal data (IP addresses, device fingerprints, cookies) require a legal basis — usually explicit consent. Loading tracking scripts before consent is obtained is a GDPR violation. Data Protection Authorities across Europe have issued fines specifically for this.
How to fix it
Only load tracking scripts after the user has given consent: 1. Use a tag manager (Google Tag Manager) that is controlled by your consent platform — the CMP fires the tag only after consent 2. Or use a consent-aware loading approach: if (userHasConsented()) { // load analytics script } 3. Consider privacy-friendly analytics that do not require consent: - Plausible Analytics (EU-hosted, no cookies) - Fathom Analytics - Matomo (self-hosted, can be cookie-free) 4. For Facebook Pixel specifically: only fire events after consent and enable 'Limited Data Use' mode for California users
Exposed Files
No sensitive files exposedWhat is this?
The .env file is a configuration file used by Laravel, Node.js, and many other frameworks to store environment-specific settings such as database credentials, API keys, secret tokens, and application configuration.
Why does it matter?
Exposing .env gives attackers your database password, secret keys, and API credentials in a single file. This allows immediate database access, session forgery, and abuse of third-party services billed to you. It is one of the most critical vulnerabilities a web server can have.
How to fix it
Nginx — add to your server block: location ~ /\.env { deny all; return 404; } Apache — add to .htaccess: <Files ".env"> Order allow,deny Deny from all </Files> Also rotate all credentials immediately: database password, API keys, APP_KEY, etc. Assume they are already compromised.
What is this?
The .git directory is the repository created by Git to track version history, branches, commits, and file contents. When exposed via a web server, attackers can reconstruct the entire source code by downloading the repository files.
Why does it matter?
A publicly accessible .git directory gives attackers your complete source code including every past commit — even if you deleted sensitive files, they remain in the commit history. Attackers can find hardcoded credentials, API keys, business logic, and vulnerability patterns in the code.
How to fix it
Nginx — block access to .git: location ~ /\.git { deny all; return 404; } Apache — add to .htaccess: RedirectMatch 404 /\.git Alternatively, deploy from a build artifact rather than cloning directly to the web root. The .git directory should never exist in a production web root.
What is this?
phpinfo() is a built-in PHP function that outputs a detailed page showing the PHP version, configuration directives, loaded extensions, environment variables, server paths, and build information.
Why does it matter?
The phpinfo output gives attackers a detailed map of your server: exact PHP version (for CVE targeting), enabled extensions, file paths, and environment variables (which may include credentials). This is an information disclosure vulnerability that makes all other attacks easier to tailor.
How to fix it
Delete phpinfo.php (and any similar files like info.php, test.php, i.php) from your web root immediately: rm /var/www/html/phpinfo.php Search for any others: find /var/www -name 'phpinfo.php' -o -name 'info.php' Never create diagnostic files on production servers. Use staging environments for diagnostics.
What is this?
SQL backup files (backup.sql, dump.sql, database.sql, etc.) are plain-text exports of database content produced by tools like mysqldump. When accessible via HTTP, the entire database can be downloaded.
Why does it matter?
A publicly downloadable database backup gives attackers all user data, emails, password hashes (or worse, plaintext passwords), order records, and any other data your application stores. This is a direct GDPR/privacy law violation and gives attackers everything needed to impersonate or contact your users.
How to fix it
Move backups outside the web root: mv /var/www/html/backup.sql /var/backups/ Search for other SQL files: find /var/www -name '*.sql' Store backups in a non-public location or use encrypted cloud storage (S3 with private ACL). Never store backup files in any publicly accessible directory.
What is this?
wp-config.php.bak is a backup copy of the WordPress configuration file. WordPress itself protects wp-config.php but backup files with .bak, .old, or .orig extensions are served as plain text by most web servers.
Why does it matter?
This file contains the MySQL database credentials (DB_NAME, DB_USER, DB_PASSWORD, DB_HOST), authentication secret keys, and the database table prefix. With these credentials an attacker can access your entire WordPress database directly.
How to fix it
Delete the backup file immediately: rm /var/www/html/wp-config.php.bak Search for other wp-config variants: find /var/www -name 'wp-config*' To protect against accidental future exposure, add to .htaccess: <Files "wp-config.php"> Order deny,allow Deny from all </Files>
What is this?
.htpasswd is the file used by Apache to store usernames and hashed passwords for HTTP Basic Authentication. It normally sits above the web root or is protected by Apache configuration.
Why does it matter?
Even though passwords are hashed, exposing this file gives attackers a list of valid usernames and hashes to crack offline. Using tools like Hashcat, weak passwords (under 10 characters) can be cracked in minutes on modern hardware.
How to fix it
Apache normally protects .htpasswd files automatically via a built-in rule. If yours is accessible, your server config may have overridden this protection. Check your VirtualHost config and .htaccess for anything that might be serving the file. Add an explicit deny: <Files ".htpasswd"> Order allow,deny Deny from all </Files> Best practice: store .htpasswd above the web root entirely, not inside it.
What is this?
web.config is the IIS (Internet Information Services) configuration file, equivalent to Apache's .htaccess. It controls URL routing, authentication, custom errors, and application settings.
Why does it matter?
Exposed web.config files frequently contain database connection strings (including passwords), application secrets, custom error paths that reveal server internals, and authentication configurations. This is sensitive infrastructure information.
How to fix it
IIS should not serve web.config by default, but misconfigurations can expose it. Add a URL rewrite rule to block direct access: <rule name="Block web.config"> <match url="web\.config" /> <action type="CustomResponse" statusCode="404" /> </rule> Verify the IIS request filtering module is active and blocks config files.
What is this?
.git/config is the Git configuration file for your repository. It contains the remote repository URL, branch tracking settings, and sometimes embedded credentials.
Why does it matter?
Exposing .git/config lets attackers discover your private Git repository URL (GitHub, GitLab, Bitbucket). If credentials are embedded in the remote URL (e.g. https://username:token@github.com/...), they are directly exposed. The repository URL itself enables cloning your entire codebase.
How to fix it
Block all .git access at the web server level: Nginx: location ~ /\.git { deny all; return 404; } Apache (.htaccess): RedirectMatch 404 /\.git Or: never deploy .git directories to production servers. Use a CI/CD pipeline that only copies compiled/built files to the server, not the full git repository.
What is this?
composer.lock records the exact version of every PHP dependency installed in your project. It's created by Composer when you run `composer install`.
Why does it matter?
Exposing composer.lock gives attackers a precise inventory of every library in your application, including its exact version number. They can cross-reference this against CVE databases (cve.mitre.org, packagist advisories) to find unpatched vulnerabilities in your specific versions and craft targeted exploits.
How to fix it
Store composer.json and composer.lock above the web root: For Laravel: these files should be in the project root, with only the public/ subdirectory as the web root. Most Forge/Vapor deployments do this correctly by default. If your web root is the project root, block access: Nginx: location ~ /composer\.(json|lock) { deny all; } Apache: <FilesMatch "composer\.(json|lock)"> Deny from all </FilesMatch> Then run: composer audit To check for known vulnerabilities in your current dependencies.
What is this?
Apache's mod_status provides a /server-status page that shows real-time server statistics: active requests, client IP addresses, URLs being requested, server version, and performance metrics.
Why does it matter?
Exposing server-status leaks live visitor data (IPs, pages they're visiting), your exact Apache version, loaded modules, and server performance data. Attackers can use this to identify high-value endpoints, confirm server software, and monitor traffic patterns.
How to fix it
Restrict server-status to localhost only: <Location /server-status> Require local </Location> Or disable mod_status entirely if you don't need it: sudo a2dismod status sudo systemctl restart apache2 If you need remote monitoring access, restrict it to specific trusted IPs: Require ip 192.168.1.0/24
TLS / Cipher Strength
100/100TLS 1.3 supported
TLS 1.3 is supported — the most secure and performant TLS version.
TLS 1.2 supported
TLS 1.2 is supported — required as a minimum for modern compatibility.
TLS 1.1 disabled
TLS 1.1 is disabled — this deprecated version is correctly rejected.
TLS 1.0 disabled
TLS 1.0 is disabled — this obsolete version is correctly rejected.
Perfect Forward Secrecy (PFS)
Server supports ECDHE cipher suites — session keys are ephemeral and past sessions cannot be decrypted if the private key is ever compromised.
API Security
100/100API/docs endpoints
No publicly accessible API documentation or admin endpoints were found.
GraphQL introspection
No GraphQL endpoint detected.
WordPress user enumeration
WordPress user enumeration via REST API is not possible (or WordPress is not used).
Subdomain Takeover
Subdomain takeover
No subdomain takeover vulnerabilities detected.
Accessibility
100/100HTML lang attribute
The <html> element has a lang attribute — helps screen readers use the correct language.
Viewport meta tag
A viewport meta tag is present — enables correct rendering on mobile devices.
Page title
A descriptive page title is present: "BudgetPixels - AI-Powered Web &amp; App Development | Websites &amp; Apps Laten "
Meta description
A meta description is present — improves SEO and search result previews.
Image alt attributes
All 6 images have alt attributes.
Single H1 heading
Exactly one H1 heading found — correct for accessibility and SEO.
Form labels
No form inputs requiring labels detected on this page.
Robots.txt & Sitemap
85/100robots.txt present
A valid robots.txt file was found.
Crawlers not fully blocked
robots.txt does not fully block all search engine crawlers.
Sitemap referenced in robots.txt
robots.txt references sitemap: https://budgetpixels.nl/sitemap.xml
Sitemap accessible
A valid XML sitemap is accessible containing 11 URLs.
security.txt present
No security.txt found at /.well-known/security.txt.
Fix: Create a security.txt file (RFC 9116) with Contact: and Expires: fields to enable responsible vulnerability disclosure.
Branding & Social
70/100Favicon
A favicon is present — shown in browser tabs and bookmarks.
Apple Touch Icon
No Apple Touch Icon found.
Fix: Add <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"> for iOS home screen support.
Web App Manifest
No Web App Manifest found.
Fix: Add a manifest.json (or site.webmanifest) with name, icons, and theme_color for PWA support.
Open Graph title
og:title is set: "BudgetPixels - AI-Powered Web &amp; App Development | Websites &amp; Apps Laten "
Open Graph description
og:description is set.
Open Graph image
og:image is set — links shared on social media will show a preview image.
Twitter/X Card
twitter:card is set to "summary_large_image" — links will show rich previews on X/Twitter.
Theme color
No theme-color meta tag found.
Fix: Add <meta name="theme-color" content="#yourcolor"> to brand the browser address bar on mobile.
Detected Technologies
Carbon & Sustainability
Green hosting
This website is not confirmed to be hosted on green infrastructure.
Fix: Consider migrating to a green hosting provider. Find certified providers at thegreenwebfoundation.org.
Modern HTTP protocol
Only HTTP/1.1 detected. Upgrading to HTTP/2 reduces connection overhead and energy use.
Fix: Enable HTTP/2 on your web server (Nginx: http2 on; Apache: LoadModule http2_module).
Gzip compression enabled
Gzip compression is active — reduces data transfer size and energy use.
Broken Links
Broken internal links
All 10 sampled internal links returned successful responses.
OWASP Top 10 Analysis
2021A01:2021 – Broken Access Control
LowNo broken access control issues detected. Access restrictions appear properly configured.
A02:2021 – Cryptographic Failures
MediumIssues found: SSL/TLS configuration has weaknesses.
Fix: Enable HTTPS with strong TLS 1.2+ configuration. Set HSTS header with a long max-age. Remove all mixed content. Use secure cipher suites only.
A03:2021 – Injection
MediumIssues found: Content-Security-Policy is missing or weak (XSS protection reduced).
Fix: Implement a strict Content-Security-Policy. Set X-Content-Type-Options: nosniff. Sanitize and encode all user input. Use parameterized queries for database access.
A04:2021 – Insecure Design
MediumIssues found: No visible rate limiting headers detected (may still be present server-side).
Fix: Add X-Frame-Options or CSP frame-ancestors to prevent clickjacking. Disable GraphQL introspection in production. Implement rate limiting on all endpoints.
A05:2021 – Security Misconfiguration
MediumIssues found: Dangerous ports are open and accessible from the internet.
Fix: Remove server version headers. Close unnecessary ports. Remove all exposed configuration files. Disable debug mode in production.
A06:2021 – Vulnerable and Outdated Components
LowNo known vulnerable components detected in the visible technology stack.
A07:2021 – Identification and Authentication Failures
MediumIssues found: Session cookie 'XSRF-TOKEN' missing HttpOnly flag.
Fix: Disable WordPress user enumeration. Remove exposed credential files. Set Secure, HttpOnly, and SameSite flags on all session cookies.
A08:2021 – Software and Data Integrity Failures
MediumIssues found: Cross-Origin-Opener-Policy (COOP) header not set; Cross-Origin-Embedder-Policy (COEP) header not set; 1 external script(s) loaded without Subresource Integrity (SRI).
Fix: Add Subresource Integrity (SRI) hashes to all external scripts and stylesheets. Set COOP and COEP headers for cross-origin isolation.
A09:2021 – Security Logging and Monitoring Failures
MediumIssues found: No security.txt file found (RFC 9116) — security researchers cannot easily report vulnerabilities.
Fix: Add a /.well-known/security.txt file with contact information per RFC 9116. Configure custom error pages that do not expose internal details.
A10:2021 – Server-Side Request Forgery (SSRF)
LowNo SSRF indicators detected. No open redirects or exposed internal endpoints found.
Full report
DNS & Email Security
58/100SPF record configured
SPF record found: "v=spf1 +a +mx +ip4:45.82.191.185 -all".
DMARC record configured
DMARC record found with policy "quarantine": "v=DMARC1; p=quarantine;".
CAA record configured
No CAA record found. Any Certificate Authority can issue SSL certs for your domain.
Fix: Add a CAA DNS record, e.g.: 0 issue "letsencrypt.org" to restrict SSL issuance.
DKIM record configured
No DKIM record found for common selectors. DKIM cryptographically signs outgoing emails, making them verifiable and preventing tampering in transit.
Fix: Configure DKIM in your email provider (Google Workspace, Microsoft 365, etc.) and publish the TXT record they provide at {selector}._domainkey.budgetpixels.nl
MTA-STS (email transport security)
No MTA-STS record found at _mta-sts.budgetpixels.nl. Without it, email delivery to your domain could silently fall back to unencrypted connections.
Fix: Implement MTA-STS: add a TXT record at _mta-sts.budgetpixels.nl with value "v=STSv1; id=YYYYMMDD01" and publish a policy file at https://mta-sts.budgetpixels.nl/.well-known/mta-sts.txt
IPv6 support
No AAAA record found. The domain is IPv4-only.
Fix: Add an AAAA record to support IPv6. Most modern hosting providers and CDNs assign IPv6 addresses automatically.
BIMI record
No BIMI record found. BIMI lets your brand logo appear in email clients that support it — a trust and branding signal for recipients.
Fix: BIMI requires DMARC with p=quarantine or p=reject. Then add a TXT record at default._bimi.budgetpixels.nl: v=BIMI1; l=https://yourdomain.com/logo.svg
DNSSEC
DNSSEC could not be confirmed via this check. Verify with your domain registrar.
Fix: Enable DNSSEC through your domain registrar to protect against DNS cache poisoning.
SSL & HTTPS
73/100HTTPS / SSL enabled
The website is accessible over HTTPS.
SSL certificate valid
Certificate is valid and expires on 2026-06-26 (83 days left).
HTTP redirects to HTTPS
HTTP traffic is permanently (301) redirected to HTTPS.
HSTS header configured
No Strict-Transport-Security (HSTS) header found.
Fix: Add: Strict-Transport-Security: max-age=31536000; includeSubDomains
No weak cipher suites
Server accepts weak cipher suite(s): RC4, 3DES, EXPORT, NULL. These ciphers have known cryptographic weaknesses.
Fix: Restrict your cipher list in your server config: Nginx: ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:!aNULL:!MD5:!3DES:!RC4; Apache: SSLCipherSuite HIGH:!aNULL:!MD5:!3DES:!RC4 Then reload your server.
TLS 1.0 and 1.1 disabled
Server only accepts TLS 1.2 or higher. Deprecated TLS versions are not supported.
Content & CMS
88/100No mixed content detected
No insecure HTTP resources (scripts, images, stylesheets) found in the page HTML.
CMS admin panel not publicly accessible
No publicly accessible CMS admin interface found at common paths.
CMS version not exposed
No CMS version information found in the page source.
Subresource Integrity (SRI)
4 of 4 external script(s)/stylesheet(s) load without an integrity= hash. If the CDN is compromised, malicious code could be silently injected into your pages.
Fix: Add integrity= and crossorigin= attributes to external <script> and <link> tags. Generate hashes at https://www.srihash.org/
No open redirect
No open redirect detected via common redirect parameters.
Directory listing disabled
Directory listing is not enabled — files cannot be browsed directly.
Security Headers
33/100Server version not disclosed
The Server header does not expose version information.
Content-Security-Policy
No Content-Security-Policy header found.
Fix: Add a Content-Security-Policy header to restrict which resources the browser may load, preventing XSS attacks.
X-Frame-Options
X-Frame-Options: SAMEORIGIN — protects against clickjacking.
X-Content-Type-Options
X-Content-Type-Options: nosniff is set — prevents MIME-type sniffing.
Referrer-Policy
No Referrer-Policy header found.
Fix: Add Referrer-Policy: strict-origin-when-cross-origin to control how much referrer info is sent.
Permissions-Policy
No Permissions-Policy header found.
Fix: Add a Permissions-Policy header to restrict browser features like camera, microphone, and geolocation.
Cookie security flags
One or more cookies are missing security flags: XSRF-TOKEN (missing: HttpOnly).
Fix: Set HttpOnly (prevents JS access), Secure (HTTPS only), and SameSite=Lax or Strict on all cookies.
Cross-Origin-Opener-Policy
No Cross-Origin-Opener-Policy (COOP) header found.
Fix: Add Cross-Origin-Opener-Policy: same-origin to isolate your browsing context and protect against cross-origin attacks and Spectre-like vulnerabilities.
Cross-Origin-Embedder-Policy
No Cross-Origin-Embedder-Policy (COEP) header found.
Fix: Add Cross-Origin-Embedder-Policy: require-corp to enable advanced browser isolation features (required for SharedArrayBuffer and high-resolution timers).
X-XSS-Protection (deprecated)
X-XSS-Protection: 1; mode=block — Note: this header is deprecated and ignored by modern browsers. Rely on CSP instead.
Performance & SEO
100/100Fast server response time (TTFB)
Time To First Byte: 107 ms (measured from our scanner server) — excellent.
Response compression enabled
Compression is enabled (gzip) — reduces transfer size and speeds up page loads.
robots.txt present
A robots.txt file was found and is accessible.
XML sitemap present
An XML sitemap was found — helps search engines discover and index your pages.
security.txt present
No security.txt file found at /.well-known/security.txt or /security.txt.
Fix: Create a security.txt file (RFC 9116) at /.well-known/security.txt to provide security researchers with a responsible disclosure contact.
HTTP Methods
100/100OPTIONS method does not expose allowed methods
The server does not respond to OPTIONS requests with an Allow header, hiding available HTTP methods.
TRACE method is disabled
The TRACE method is disabled, preventing Cross-Site Tracing (XST) attacks.
PUT method rejects arbitrary uploads
The PUT method does not accept arbitrary file uploads to the web root.
Email Security
75/100SPF record is strict (-all)
SPF record ends with -all (hard fail), properly preventing email spoofing.
DMARC policy is quarantine
DMARC policy is set to quarantine. For maximum protection, consider upgrading to reject.
Fix: After monitoring DMARC reports to confirm no legitimate mail is affected, change policy from p=quarantine to p=reject.
MX records configured
1 MX record(s) found for this domain.
SMTP banner not exposing version
Could not retrieve SMTP banner or banner does not disclose software version.
No DANE/TLSA record
No DANE TLSA record found. DANE provides additional verification for TLS certificates on mail servers.
Directory Discovery
87/100Admin panel found at /admin
Path /admin returned HTTP 302 (redirects). This could expose Admin panel to attackers.
Fix: Verify that /admin requires proper authentication.
SVN repository found at /.svn
Path /.svn returned HTTP 403 (forbidden but exists). This could expose SVN repository to attackers.
Fix: Verify that /.svn requires proper authentication.
Mercurial repository found at /.hg
Path /.hg returned HTTP 403 (forbidden but exists). This could expose Mercurial repository to attackers.
Fix: Verify that /.hg requires proper authentication.
macOS metadata file found at /.DS_Store
Path /.DS_Store returned HTTP 403 (forbidden but exists). This could expose macOS metadata file to attackers.
Fix: Verify that /.DS_Store requires proper authentication.
Error Disclosure
100/100404 error page is clean
The 404 error page does not expose internal server details or stack traces.
Server error pages are clean
Server error responses do not expose internal details.
No version information in error responses
Error responses do not reveal PHP version or framework version in headers.
Input Reflection
100/100No input reflection detected
URL parameters are not reflected in the HTML response, reducing XSS risk.
Error pages do not reflect URL
Error pages do not reflect the requested URL in the response body.
Forms submit to same origin
All detected forms submit to the same domain or use relative URLs.
Session Security
50/100Session cookies have Secure flag
All session cookies include the Secure flag, ensuring they are only sent over HTTPS.
Session cookies missing HttpOnly flag
One or more session cookies do not have the HttpOnly flag, making them accessible via JavaScript (XSS risk).
Fix: Set the HttpOnly flag on all session cookies to prevent access from client-side scripts.
Session cookies have SameSite flag
All session cookies include a SameSite attribute, reducing CSRF risk.
No cookie prefix used
Session cookies do not use the __Host- or __Secure- prefix. These prefixes provide additional protection against cookie overwriting.
Fix: Consider using __Host- prefix for session cookies (requires Secure flag, no Domain, Path=/).
Cookie Compliance
100/100Cookie consent mechanism detected
A cookie consent banner or notice was detected on the page, which is required under GDPR/ePrivacy.
No tracking cookies on initial load
No known tracking or analytics cookies are set on the initial page load (before consent).
Only 2 cookie(s) on initial load
The site sets 2 cookie(s) on the initial page load, suggesting minimal cookie usage.
No excessively long-lived cookies
All cookies have reasonable expiration times (under 1 year).
Critical issues (6)
What is this?
HTTP Strict Transport Security (HSTS) is a response header that tells browsers to only ever connect to your site over HTTPS — even if the user types http:// or clicks an http:// link. The browser enforces this locally for the duration of max-age.
Why does it matter?
Even with an HTTP redirect in place, the very first request could go over HTTP before being redirected. A network attacker could intercept that first request (SSL stripping attack). HSTS prevents this by making the browser upgrade to HTTPS before making any request.
How to fix it
Add this header to your HTTPS responses: Strict-Transport-Security: max-age=31536000; includeSubDomains Nginx: add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; Apache: Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains" Only add HSTS after you are certain your entire site works over HTTPS, including all subdomains if you use includeSubDomains.
What is this?
Content Security Policy (CSP) is a browser security feature that lets you control which resources (scripts, styles, images, fonts) a page is allowed to load, and from which origins.
Why does it matter?
CSP is one of the most effective defences against Cross-Site Scripting (XSS) attacks. Without CSP, an attacker who injects malicious JavaScript into your page can load resources from anywhere, steal session cookies, or redirect users.
How to fix it
Add a Content-Security-Policy header. Start with a report-only policy to detect issues without breaking anything: Content-Security-Policy-Report-Only: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; Once tested, switch to enforcing: Content-Security-Policy: default-src 'self'; ... CSP policies can be complex for sites with third-party scripts. Use https://csp-evaluator.withgoogle.com/ to evaluate your policy.
What is this?
The Referrer-Policy header controls how much information about the originating page is included in the Referer header when a user navigates away from your site or when resources are loaded.
Why does it matter?
Without a Referrer-Policy, the full URL of the current page (which may include session tokens, user IDs, or sensitive paths) is sent to external sites in the Referer header. This can leak private information to third-party analytics, CDN providers, or ad networks.
How to fix it
Recommended value: Referrer-Policy: strict-origin-when-cross-origin (sends origin only for cross-origin requests, full URL for same-origin) Nginx: add_header Referrer-Policy "strict-origin-when-cross-origin" always; Apache: Header always set Referrer-Policy "strict-origin-when-cross-origin" Alternatives: no-referrer (most private), same-origin (no cross-origin referrer).
What is this?
HTTP cookies can carry security flags: HttpOnly (prevents JavaScript from reading the cookie, blocking XSS-based session theft), Secure (transmits the cookie only over HTTPS, never plain HTTP), and SameSite (controls cross-site submission, blocking CSRF attacks).
Why does it matter?
Without HttpOnly, malicious scripts injected via XSS can steal session cookies. Without Secure, cookies can leak over HTTP redirects or mixed-content requests. Without SameSite, cookies are sent with cross-site requests, enabling CSRF attacks that make users perform actions without their knowledge.
How to fix it
Add all three flags when setting cookies: Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Lax PHP: session_set_cookie_params([ 'httponly' => true, 'secure' => true, 'samesite' => 'Lax', ]); Laravel: in config/session.php set: 'http_only' => true, 'secure' => true, 'same_site' => 'lax', Use SameSite=Lax for most sites. Use SameSite=Strict if cross-site links to your site don't need to carry the session.
Warnings (27)
What is this?
CAA (Certification Authority Authorization) is a DNS record that specifies which Certificate Authorities (CAs) are allowed to issue SSL/TLS certificates for your domain.
Why does it matter?
Without CAA records, any of the hundreds of trusted CAs worldwide can issue a certificate for your domain. A compromised or rogue CA could issue a fraudulent certificate for your domain, enabling MITM attacks. CAA limits this risk to your chosen CA(s).
How to fix it
Add CAA records to your DNS. Example for Let\'s Encrypt only: 0 issue "letsencrypt.org" For multiple CAs (e.g. Let\'s Encrypt + DigiCert): 0 issue "letsencrypt.org" 0 issue "digicert.com" To also allow wildcard certificates: 0 issuewild "letsencrypt.org" For email notifications on unauthorized issuance attempts: 0 iodef "mailto:security@yourdomain.com" Check current CAA records at: sslmate.com/caa
What is this?
DKIM (DomainKeys Identified Mail) adds a cryptographic signature to every outgoing email. The signature is created with a private key on your mail server and verified by recipients using a public key published in DNS.
Why does it matter?
DKIM proves that an email actually came from your mail server and was not modified in transit. Without DKIM, anyone can send emails that appear to be from your domain (spoofing), and DMARC alignment checks will fail even if SPF passes.
How to fix it
DKIM is configured in your email provider, not directly in DNS. Here is the process: 1. Generate a DKIM key pair in your email provider: - Google Workspace: Admin console → Apps → Gmail → Authenticate email - Microsoft 365: Admin center → Settings → Domains → DKIM - Mailchimp/SendGrid/Mailjet: Each has a DKIM setup page in their dashboard 2. Copy the TXT record they provide and add it to your DNS: Name: selector._domainkey.yourdomain.com Value: v=DKIM1; k=rsa; p=MIGf... 3. Activate DKIM signing in your provider after publishing the DNS record. The selector name (e.g. 'google', 'selector1') comes from your email provider.
What is this?
MTA-STS (Mail Transfer Agent Strict Transport Security) is a standard that forces other mail servers to use encrypted TLS connections when delivering email to your domain. Without it, a network attacker could silently strip TLS from email in transit.
Why does it matter?
Email is delivered between servers using SMTP. By default, SMTP tries TLS but falls back to plaintext if TLS is not available — a downgrade attack. MTA-STS prevents this fallback, ensuring all email delivered to your domain is encrypted in transit.
How to fix it
Implementing MTA-STS requires two things: 1. A DNS TXT record at _mta-sts.yourdomain.com: v=STSv1; id=20240101001 2. A policy file hosted at: https://mta-sts.yourdomain.com/.well-known/mta-sts.txt Policy file content: version: STSv1 mode: enforce mx: mail.yourdomain.com max_age: 86400 Start with mode: testing to see reports before enforcing. Use mta-sts.io for a guided setup.
What is this?
DNSSEC (DNS Security Extensions) adds cryptographic signatures to DNS records, allowing resolvers to verify that DNS responses are authentic and have not been tampered with.
Why does it matter?
Without DNSSEC, DNS responses can be forged (DNS cache poisoning / BGP hijacking), redirecting your visitors to a fake server without them knowing. DNSSEC ensures the DNS record they receive is the one you published.
How to fix it
DNSSEC must be enabled at both your DNS registrar and your DNS hosting provider: 1. Enable DNSSEC at your domain registrar (Namecheap, GoDaddy, TransIP, etc.) 2. Enable DNSSEC signing at your DNS host (Cloudflare enables this automatically) 3. The registrar publishes DS records pointing to your zone\'s key If you use Cloudflare: enable DNSSEC with one click in the DNS tab. Note: DNSSEC is difficult to set up incorrectly — misconfiguration can take your domain offline. Follow your registrar\'s guide carefully.
What is this?
Subresource Integrity (SRI) is a browser security feature that lets you specify a cryptographic hash for external scripts and stylesheets. The browser refuses to execute the resource if its content does not match the hash.
Why does it matter?
If a CDN you rely on is compromised (a real and recurring attack vector), an attacker can replace your JavaScript library with malicious code that steals user data, injects cryptomining scripts, or performs other attacks. SRI prevents this by making the browser verify the file has not been altered.
How to fix it
Add integrity= and crossorigin= attributes to your external resources: <script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js" integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=" crossorigin="anonymous" ></script> Generate hashes for any URL at: https://www.srihash.org/ For build tools, use webpack-subresource-integrity or vite-plugin-sri to add hashes automatically during builds.
What is this?
Permissions-Policy (formerly Feature-Policy) lets you control which browser features and APIs your site is allowed to use, and whether third-party content embedded in iframes can access them.
Why does it matter?
Without this header, embedded third-party scripts or iframes could theoretically request access to the camera, microphone, geolocation, payment APIs, and more. Restricting these features reduces your attack surface.
How to fix it
Example header that disables features not needed for most sites: Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=() Nginx: add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; Apache: Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()" Only disable features you genuinely don't use. Adding this header is a low-effort, high-value improvement.
Get this report emailed to you
Create a free account to save your scan results, monitor your sites, and get alerted when your score drops.