PCI DSS Web Application Security Requirements: What You Need to Test
If your application handles payment card data, PCI DSS sets specific requirements for how you must test its security. PCI DSS 4.0, which became fully effective in 2024, strengthened the web application security requirements considerably compared to earlier versions.
This guide explains what PCI DSS actually requires for web application security, which requirements apply to application-layer testing, and how to structure your testing program to satisfy both the letter of compliance and the spirit of it.
Scope: What PCI DSS Covers
PCI DSS applies to any system that stores, processes, or transmits cardholder data (CHD) or is connected to the cardholder data environment (CDE). Web applications that:
- Accept payment card information directly (checkout forms, payment pages)
- Pass card data to a payment processor
- Are part of the network that connects to payment processing systems
...are all in scope. If you use a third-party payment processor with iframes or redirects, your scope may be narrower — but the application that hosts the checkout page still has requirements to meet.
The Core Requirements for Web Application Security
Requirement 6.2 — Bespoke and Custom Software Security
Requirement 6.2 mandates secure development practices. For AppSec teams, the relevant sub-requirements are:
| Sub-req | What it requires |
|---|---|
| 6.2.4 | Software engineering techniques or other methods defined to prevent or mitigate common software attacks — injection attacks, attacks on data and data structures, attacks on cryptography |
| 6.2.4.a | Processes must be defined to address attacks including: injection flaws (SQL, LDAP, XPath, other), broken authentication, cryptographic failures, injection via parameter manipulation, improper error handling, cross-site scripting |
In practice, 6.2.4 requires that your development process includes controls addressing the OWASP Top 10 categories — code review, SAST, developer training, or equivalent.
Requirement 6.3 — Security Vulnerabilities Are Identified and Addressed
This is the vulnerability management requirement. 6.3.2 mandates an inventory of all bespoke software and third-party software. The critical sub-requirement for testing:
| Sub-req | What it requires | Frequency |
|---|---|---|
| 6.3.3 | All software components are protected from known vulnerabilities | Ongoing |
| 6.3.3.b | Security patches installed within one month of release for critical vulnerabilities | Within 1 month |
Requirement 6.4 — Public-Facing Web Applications Are Protected
This is where the testing requirements become most specific. For any web application in the CDE that is publicly accessible:
| Sub-req | Requirement |
|---|---|
| 6.4.1 | For public-facing web applications, new threats and vulnerabilities are addressed on an ongoing basis via automated technical solutions (DAST tools, vulnerability scanners) OR a web application firewall |
| 6.4.2 | Automated technical solution (DAST) performs the scanning |
| 6.4.3 | All payment page scripts that are loaded and executed in the consumer's browser are managed per specific requirements (inventory, authorization, integrity) |
6.4.1 gives you a choice: continuous automated scanning OR a WAF. In practice, most organizations implement both — a WAF for runtime protection and DAST scanning to find vulnerabilities before they're exploited.
Requirement 11.3 — Penetration Testing
Requirement 11.3 is the explicit penetration testing requirement. It specifies:
| Sub-req | Requirement | Frequency |
|---|---|---|
| 11.3.1 | External and internal penetration testing is performed at least once every 12 months and after significant changes | Annual + after changes |
| 11.3.1.1 | Penetration testing of network segmentation is performed at least every 6 months | Semi-annual |
| 11.3.1.2 | Penetration testing covers the CDE perimeter and critical systems | Annual |
| 11.3.2 | All exploitable vulnerabilities found are corrected and testing repeated to verify correction | After findings |
What PCI DSS Penetration Testing Must Cover
Requirement 11.3.1 specifies that penetration testing must include:
- Application-layer testing (OWASP Top 10 and equivalent)
- Network-layer testing for both network and operating system components
- Testing of controls to protect cardholder data (encryption in transit, access controls)
- Testing of any segmentation controls
The Penetration Testing Guidance published by the PCI SSC provides additional specifics on methodology. It recommends testing against OWASP categories as a minimum baseline for application-layer testing.
Requirement 11.3 "After Significant Changes" — What Counts?
The "after significant changes" clause is where organizations frequently fall short. PCI DSS defines significant changes to include:
- New system component installations
- Changes to system or network configurations
- New or changed business processes
- Changes to network traffic flows
- Changes to boundary controls (firewall rules, WAF rules)
For most active development teams, "after significant changes" effectively means continuous testing. An annual pentest followed by 11 months of untested deployments does not satisfy the intent of 11.3.1 for organizations deploying code frequently.
This is why the PCI SSC updated 6.4.1 in PCI DSS 4.0 to explicitly require automated technical solutions for ongoing scanning — recognizing that annual manual testing is insufficient for modern development cycles.
Requirement 6.4.3 — Payment Page Script Integrity
6.4.3 is new in PCI DSS 4.0 and specifically targets supply chain attacks on payment pages (Magecart-style attacks). It requires:
- Inventory: maintain a list of all scripts authorized to load on payment pages, with business justification for each
- Integrity: each listed script must have a method to verify it has not been tampered with (Subresource Integrity hashes, Content Security Policy, or equivalent)
- Authorization: must confirm no unauthorized scripts are present
<!-- SRI example: verify script has not been modified -->
<script src="https://cdn.payment-provider.com/v3/checkout.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxXhSCFEkWooo8WDLQ9fo5Gl3ZDz"
crossorigin="anonymous"></script>
<!-- CSP header to restrict which scripts can load -->
Content-Security-Policy: script-src 'self' 'sha384-...' https://cdn.payment-provider.com;
default-src 'none';
Testing for 6.4.3 compliance:
- Load the payment page and inspect all scripts that execute (browser DevTools → Network → JS)
- Compare to the authorized script inventory
- Verify SRI hashes are present on external scripts
- Check Content-Security-Policy headers restrict script loading
- Look for inline scripts that could be injection vectors
Vulnerability Scanning Requirements (Requirement 11.2)
Requirement 11.2 covers vulnerability scanning (distinct from penetration testing):
| Requirement | Scope | Frequency |
|---|---|---|
| 11.2.1 | Internal vulnerability scans | At least quarterly + after significant changes |
| 11.2.2 | External vulnerability scans via ASV (Approved Scanning Vendor) | Quarterly |
External scans must be conducted by a PCI SSC Approved Scanning Vendor (ASV). Internal scans can be conducted with your own tooling. Neither replaces penetration testing — they are additive requirements.
Mapping Testing Activities to Requirements
| Activity | Satisfies | Frequency |
|---|---|---|
| Annual penetration test (application layer) | 11.3.1, 11.3.1.2 | Annual |
| Penetration test after major releases | 11.3.1 (significant changes clause) | Per release |
| Segmentation test | 11.3.1.1 | Semi-annual |
| Internal vulnerability scan | 11.2.1 | Quarterly |
| External ASV scan | 11.2.2 | Quarterly |
| Automated DAST scanning | 6.4.1, 6.4.2 | Continuous |
| Payment page script audit | 6.4.3 | Continuous + per change |
| Third-party component inventory | 6.3.2, 6.3.3 | Continuous |
Common PCI DSS Testing Program Gaps
In practice, PCI audits commonly find these gaps in web application security testing programs:
- Annual pentest, no change-triggered testing: significant changes happen throughout the year, each requiring a test that never happens
- External ASV scan without internal scanning: both are required; organizations often run only the external scan for compliance evidence
- Vulnerability findings not retested: 11.3.2 requires retesting after remediation; many organizations remediate but never retest
- Scope creep ignored: new services added to the CDE are not added to the testing scope
- 6.4.3 not implemented: payment page scripts not inventoried or verified — this is the newest and most commonly missed requirement
Automated Scanning and PCI DSS Compliance
Requirement 6.4.1 explicitly references "automated technical solutions" for ongoing protection of public-facing web applications. DAST tools that scan continuously or on each deployment satisfy this requirement and provide evidence for auditors.
The practical argument for continuous DAST over a single annual scan is straightforward: PCI DSS requires testing after significant changes. If you deploy weekly and each deployment is a significant change, you need weekly testing — or continuous scanning that catches new vulnerabilities as they're introduced.
Meet PCI DSS 6.4 with continuous automated scanning. Ironimo provides DAST scanning using real Kali Linux tools on schedule or on demand — building the evidence trail auditors need and catching vulnerabilities before your next QSA assessment. No pentester invoice for every deployment.
Start free scanKey Takeaways
- PCI DSS 4.0 requires both automated scanning (6.4.1) AND annual penetration testing (11.3.1) for in-scope web applications — these are not interchangeable
- The "after significant changes" clause in 11.3.1 means active development teams need more than annual testing
- 6.4.3 (payment page script integrity) is new in PCI DSS 4.0 and specifically targets supply chain attacks — it requires an authorized script inventory and integrity verification
- External ASV scans and internal vulnerability scans are both required quarterly under 11.2
- Remediation without retesting violates 11.3.2 — the test cycle is not complete until you verify the fix worked