Guide · Rules and requirements

Software security checklist: 30 checks you can hold your supplier to

The short answer: most security incidents in the software of small and medium-sized companies come down to the same few things: weak logins without two-factor authentication, systems that are not updated, overly broad access, missing or untested backups and basic coding flaws. This checklist gathers 30 concrete checks you can use to hold your supplier to account, without having to be a developer yourself.

12 min read · Updated 1 October 2026

One Monday morning nobody can log in to the customer portal. It turns out that a former intern still had admin access with the password “Summer2023!”, and that the same password had leaked from a completely different service. Nobody had turned on two-factor authentication, and the most recent backup that could actually be restored was three weeks old. This was a very ordinary attack. It is the kind of incident we hear about most often, and it could have been prevented with five of the 30 checks below.

The checklist is written for owners and managers who buy or own software: website, webshop, customer portal, app or internal system. All you need is to be able to ask the questions and expect clear answers. If you process particularly sensitive data or are covered by sector rules, supplement it with a security adviser.

Why do security holes hit small companies too?

Because most attacks are automated. Bots scan the entire internet for known holes in outdated plugins, for login pages where leaked passwords can be tried, and for open databases and forgotten test environments. They look for weaknesses and pay no attention to company size. A small webshop with an outdated plugin is therefore just as obvious a target as a large one. The good news is that the same automated attacks are stopped by basic hygiene: updates, strong logins and limited access.

The most common risks in business software, and what typically stops them.

RiskTypical causeWhat stops itHow you check
Account takeoverReused or leaked passwordTwo-factor authentication and rate limitingAsk to see the admin login setup
Known software vulnerabilityOutdated packages or pluginsRegular updates and automated scanningAsk when the last update was
Data leak between customersMissing server-side access controlPermission checks on every requestPenetration test or code review
Ransomware or deletionNo separate, tested backupsAutomatic offsite backups and restore testsAsk for the date of the last restore test
Leaked keysSecrets in code or shared documentsSecrets in a secure vault, rotated regularlyAsk where API keys are stored

Which security checks concern login and access?

Access is the area where you can do the most yourself, because it is as much about people and routines as about code. The six checks below should be in place in every system that holds customer data.

  1. Two-factor authentication is switched on for every admin and every employee with access to customer data.
  2. Login limits the number of attempts, so bots cannot try thousands of passwords.
  3. Passwords are stored with a modern hashing algorithm and never in plain text.
  4. Every employee has their own user. Nobody shares logins such as “admin” or “office”.
  5. Roles grant least privilege: support can see customers but cannot change prices or export everything.
  6. There is a fixed routine for removing access on the day an employee or supplier leaves.

If you have many users, login with MitID or with the company’s Microsoft or Google account can be both safer and easier. Staff avoid yet another password, and when they leave and lose their work account, they lose access to your system too. We describe how MitID fits into a custom solution in our article on MitID integration in your own app.

How do you keep software updated and secure?

Modern software consists of hundreds of open-source packages, and holes are found in them all the time. That is normal and a sign the ecosystem works. The danger comes when nobody updates. A website that has not been touched for two years almost always has known vulnerabilities. Updates must therefore be a fixed, planned part of operations, independent of anyone remembering.

  1. Dependencies are scanned automatically for known vulnerabilities, and critical findings are fixed within days.
  2. Framework, server and database are updated on a fixed schedule, at least monthly for security patches.
  3. Updates are tested in a staging environment before going to production.
  4. Unused plugins, packages and features are removed, so there is less to attack.
  5. The system runs on a language and framework version that still receives security updates.

The last check is often the most expensive. If your system runs on a version that is no longer supported, there are no updates to install, and diligence does not help. This is technical debt, and the fix is a planned upgrade or a modernisation of the legacy system.

How do you protect data and backups?

  1. All traffic is encrypted with HTTPS, and old, insecure encryption is disabled.
  2. Databases and files are encrypted at rest.
  3. Automatic backups are taken at least daily and stored separately from production.
  4. At least one backup cannot be altered or deleted by anyone with production access.
  5. Restores are tested regularly, and you know the real time it takes to get back up and running.

Ask your supplier for two numbers: how much data you can lose at most (typically the time since the last backup), and how long it takes to get back up. If they cannot answer, the backup has not been tested. Where backups and data are physically stored also matters for GDPR, which we cover in our guide to hosting data in the EU.

What is OWASP, and which coding flaws should you know?

OWASP is an international non-profit that publishes, among other things, the OWASP Top 10, a list of the most critical security risks in web applications. The list is the shared language between developers, testers and customers. It is enough to ask your supplier to confirm that the seven checks below are handled. They cover the flaws that most often lead to data leaks in business software.

  1. Access control is checked on the server on every request, so a user cannot see another customer’s data by changing an ID in the URL.
  2. Database queries are parameterised, so input cannot alter the query (SQL injection).
  3. User input is validated and output is escaped, so scripts cannot be injected (XSS).
  4. Forms and actions are protected against forged requests from other sites (CSRF).
  5. Secret keys and passwords for databases and APIs live outside the code in a secure environment.
  6. Security headers such as HSTS and Content Security Policy are configured.
  7. Uploaded files are checked for type and size and stored separately from the code.

If you have a prototype built with Lovable, Bolt, Cursor or similar that real customers are going to use, read our guide on going from AI prototype to production. It covers exactly the points that are typically missing.

Monitoring, suppliers and incident response: the last 7 checks

  1. Uptime, error rates and unusual activity are monitored, and alerts go to a named recipient.
  2. Logs of logins, admin actions and errors are stored outside the system and for a fixed period.
  3. Test environments use test or anonymised data, never a copy of production.
  4. There is a written plan for what happens in an incident: who does what, and who contacts whom.
  5. You have data processing agreements and know which subcontractors can access your data.
  6. You own the domain, hosting accounts and code yourselves, so you are not locked in if a supplier disappears.
  7. Security is reviewed at least once a year together with the supplier.

With the 6 checks on login, 5 on updates, 5 on data, 7 on code and these 7, you have all 30. Ownership in check 29 is often overlooked, and it is decisive in a crisis. Read more in our guide who owns the code.

1

Detect

An alert, a customer or an employee reports something suspicious to one fixed contact.

2

Contain

Close the compromised access, rotate keys and, if needed, put the system in maintenance mode.

3

Assess

Which data is affected? If personal data is involved, assess whether the breach must be reported within 72 hours.

4

Recover

Fix the cause, restore from a clean backup and monitor closely for the next few days.

5

Learn

Write down briefly what happened and which check to add so it does not happen again.

A simple incident plan that suits a smaller company.

What does NIS2 mean for your company?

NIS2 is an EU directive on cybersecurity that Denmark has implemented in national law. It sets requirements for risk management, security measures, management accountability and incident reporting. It applies mainly to medium-sized and large companies in specific sectors such as energy, transport, health, digital infrastructure, certain kinds of manufacturing and public administration. Most small companies are not directly covered. Many will still feel it indirectly, because covered customers impose requirements on their suppliers through contracts. Whether you are covered depends on sector and size, so check the Danish authorities’ guidance or ask an adviser. We do not go into deadlines and sanctions here.

Cheap hosting with no agreement

  • Updates happen when someone remembers
  • Backups exist but have never been tested
  • No monitoring or alerts
  • In an incident, you start by finding a developer

Fixed running and maintenance

  • Security updates on a fixed schedule
  • Automatic backups and restore tests
  • Monitoring with a known recipient
  • A supplier who knows the system and can act straight away
Two ways to run the same solution.

What does security cost in a software solution?

Most security is built into good development and good operations. A common rule of thumb is that maintenance costs 15–20 % of the build price per year, and security updates, monitoring and backups make up a significant share of that. Read more about the levels in our guide to website maintenance costs. Take an example: a company with 15 employees has a customer portal that cost DKK 150,000. Running it typically costs DKK 22,500–30,000 a year, a penetration test before launch perhaps DKK 30,000–50,000, and a yearly review a day or two. Compared with the cost of a week without access to the portal, that is cheap.

With us, the fixed monthly price covers hosting, maintenance, updates, support, security and backups, and you own the code and the data. If you want your current solution reviewed against the 30 checks, or need something new built, send a short description and you will have a fixed-price proposal within 24 hours.

Questions about software security

Do we need a penetration test?
It depends on what the solution contains. If you have a customer portal with personal data, payments or access to business-critical systems, a penetration test before launch and after major changes is a sound investment. Typical prices for a scoped test of a web application range from around DKK 25,000 up to DKK 100,000 or more for large systems. For a simple brochure site it is rarely necessary, and the basic checks in this list give more security for the money. Choose an independent tester rather than the team that built the solution.
Is WordPress insecure?
The WordPress core is well maintained, and many large sites run securely on it. The risk lies in the ecosystem: themes and plugins from many different developers, some of which are no longer maintained. Every plugin is code running on your server, and if one of them has a hole, the whole site is exposed. A secure WordPress site has few, well-known plugins, automatic updates, two-factor authentication for admins and a supplier who keeps watch. We compare the platforms in our Next.js vs WordPress guide if you are considering a switch.
What is the difference between backups and high availability?
High availability means the system keeps running if a server goes down, because another one is ready. A backup means you can get data back if it is deleted, corrupted or encrypted by ransomware. You need both. If an employee accidentally deletes every customer, the deletion is copied to the standby server within a second, and only the backup can save you. A good backup is automatic, encrypted, stored somewhere other than production, cannot be altered by attackers and is tested with a real restore.
How do we find out if we have been hacked?
Many only find out when a customer calls or Google shows a warning. You can do better with simple means: monitoring of uptime and error rates, alerts on many failed login attempts, notifications when new admin users appear, and logs stored outside the system itself so an attacker cannot erase their tracks. Ask your supplier to show you which alerts are set up and who receives them outside office hours. In addition, review the list of users with access at least every quarter.
Is AI-generated code less secure?
AI tools can write code quickly, and much of it is fine. The problem is that it often looks right without being right. We typically see missing server-side access control, secret keys placed directly in the code, databases open to everyone, and packages that are outdated or do not exist. It is a particular issue in vibe-coded prototypes that suddenly get real users. AI-generated code must be reviewed and tested to the same standard as all other code. We have written a whole guide on making an AI prototype ready for production.
What is the D-mærket label, and do we need it?
D-mærket is a Danish labelling scheme for IT security and responsible data use that companies can join voluntarily. It is voluntary and can be a way to show customers and partners that you have the area under control, and its criteria are a useful reference for what a company of your size should have in place. Check the scheme’s own pages for current requirements and prices. Whether or not you pursue the label, the checklist in this guide covers many of the technical points it includes.

Want us to build it for you?

You get a fixed-price proposal within 24 hours.

Dennis Nielsen

Dennis Nielsen

Head of Operations, Ceptiv

Free consultation

One free hour of advice before you start.

Describe your project and I will contact you as soon as possible, so we can schedule a no-obligation meeting. You leave with practical advice on how to get your project off to a good start.

  • Free
  • 1 hour
  • No obligation