Learning path · Level 11 · Tutorial 3

Evaluate the Risks of Third-Party Scripts

Evaluate the trust granted to third-party browser code and explain what dependency review and server-delivered script restrictions can—and cannot—protect.

  • Level: Intermediate
  • Duration: 15 min
  • 8 steps
Start tutorial Back to the path
Evaluate the Risks of Third-Party Scripts

What you will go through

  1. A Different Download Origin Is Not Isolation See why an included third-party script executes with page-level access even when it was downloaded from another origin. 2 min
  2. Trace How Third-Party Code Reaches the Page Trace direct packages, transitive dependencies, and remotely loaded scripts that execute on the Harbor Shop checkout page. 2 min
  3. Review Need, Identity, Maintenance, and Advisories Use necessity, provenance, maintenance evidence, and advisory details to make a proportionate dependency decision. 2 min
  4. Separate Reproducibility from Trust Use lockfiles, integrity results, and advisory checks as focused evidence without treating any one of them as proof of trust. 2 min
  5. Read a Simple Script Policy Read a simple source-based script policy for Harbor Shop and distinguish narrow source permissions from broad ones. 3 min
  6. Assign Controls to the Right Layer Identify which layer can reduce included code, deliver a policy header, and enforce the delivered policy. 2 min
  7. Recognize What the Policy Cannot Guarantee A restrictive source-based policy is valuable defense in depth, but it cannot establish that permitted code is trustworthy or isolate it from the page. 2 min
  8. Make a Third-Party Script Risk Decision Integrate a fictional Harbor Shop case packet into an actionable, evidence-based third-party script risk recommendation. 2 min

What you will learn

  • Explain why a script downloaded from another origin can still access the page that includes it.
  • Assess a dependency scenario for unnecessary access, questionable provenance, or known security concerns.
  • Interpret which script sources a simple CSP example permits.
  • Distinguish controls available in front-end code from policy changes required in the serving system.

Before you start

  • Prepare a Local Project with Node.js and npm
  • Split Browser Code into JavaScript Modules
  • Diagnose Request Failures and CORS Restrictions
  • Prevent XSS When Rendering External Content

Step 1 of 8

A Different Download Origin Is Not Isolation

See why an included third-party script executes with page-level access even when it was downloaded from another origin.

An included file joins the page context

One page, two origins

One page, two origins

Harbor Shop's checkout page is at https://shop.example/checkout. It can include a third-party script whose download origin is https://cdn.widgets.example.

The different download origin describes where the browser fetched the file. It does not create a separate, isolated page for that file. When the browser executes an in-page script, it executes it in the including document's page origin and page context.

An in-page third-party script

The checkout document includes a remotely downloaded script.

html
<form id="checkout-form">
  <label>
    Email
    <input id="email" name="email" type="email" value="alex@example.com" />
  </label>
</form>

<script src="https://cdn.widgets.example/metrics.js"></script>

Where the code runs

A remotely downloaded script enters a checkout page's browser window and connects to the page DOM and email field, showing that it executes in the page context.

The download origin is separate, but the included script executes in the checkout page's context at the page origin.

Execution is the trust boundary

What inclusion grants

Page access follows execution context

After metrics.js is included and executed, its code can use normal page APIs. For example, it can read or change DOM elements, attach listeners that observe form interactions, and use JavaScript-accessible data available to code on that page.

That access is still subject to ordinary browser and page rules. It is not permission to access every system. But a different download origin alone does not prevent the script from interacting with Harbor Shop's checkout page.

Example

Example

A script can use the same DOM APIs that Harbor Shop's own browser code uses:

const emailField = document.querySelector('#email');

emailField?.addEventListener('input', (event) => {
  console.log(event.currentTarget.value);
});

This example illustrates why including a third-party script is a trust decision: it can observe input handled in the page context.

Tip

Do not confuse this with CORS

CORS is not a sandbox for an included script. CORS governs particular cross-origin resource interactions; it does not give a script that has already executed in the page a restricted DOM view based on its download origin.

Check your understanding

Apply the diagram

Using the trust-boundary diagram, which conclusion correctly evaluates the claim: “Because metrics.js comes from a different origin, it cannot read Harbor Shop's checkout email field”?

Step 2 of 8

Trace How Third-Party Code Reaches the Page

Trace direct packages, transitive dependencies, and remotely loaded scripts that execute on the Harbor Shop checkout page.

Follow the delivery paths

Three routes into the browser

At Harbor Shop, the checkout page at https://shop.example/checkout can execute third-party code through more than one route.

  • A direct package is selected by the application and imported into browser code.
  • A transitive dependency is required by that direct package and can travel into the browser with it.
  • A remote script is loaded by a <script src> URL while the page loads.

These routes matter because a browser-runtime inventory tracks code that actually reaches the page—not merely code listed somewhere in the project.

How code reaches a page

Diagram showing a checkout page receiving a same-origin application bundle that contains a direct package and its transitive dependency, plus a separate remotely loaded script from another origin.

The delivery paths differ, but all of this code can reach the checkout page's browser runtime.

Inventory what executes

Same-origin delivery does not change authorship

Suppose Harbor Shop imports the fictional package @demo/review-widget version 2.4.0. That package depends on the fictional @demo/dom-utils version 1.3.0. The build places their browser-needed code in /assets/app.js.

The page can also load a separate third-party script directly:

<script src="https://cdn.widgets.example/metrics.js"></script>

/assets/app.js has the page origin because it is delivered from shop.example. That does not make all code inside it authored by Harbor Shop. Delivery location and authorship are different facts to record in an inventory.

Checkout browser-runtime inventory

For this checkout-page inventory, include code that can execute in the browser. A development-only tool that is installed locally but not shipped in the browser build is outside this particular inventory.

Example classification for Harbor Shop. Package identities are fictional case evidence.
ItemHow it reaches the pageInventory classificationDelivery location
@demo/review-widget 2.4.0Imported by application codeDirect packageInside /assets/app.js
@demo/dom-utils 1.3.0Required by the review widgetTransitive dependencyInside /assets/app.js
metrics.jsScript src URL in the documentRemote scriptcdn.widgets.example
Development-only toolNot shipped to browserNot includedNo browser delivery

Apply the delivery graph

Classify the checkout-page code

Match each Harbor Shop item to its browser-runtime classification or delivery description.

Tap an item and then its matching pair.

Step 3 of 8

Review Need, Identity, Maintenance, and Advisories

Use necessity, provenance, maintenance evidence, and advisory details to make a proportionate dependency decision.

Decide whether the feature belongs on checkout

1. Start with the feature need

Begin with necessity, not reputation. Harbor Shop’s checkout page at https://shop.example/checkout is a high-value page: any browser-executed third-party script included there can interact with the page context.

Ask what the feature contributes on this specific page. If a review widget is not needed during checkout, remove it. If shoppers only need reassurance, a short, locally authored trust message or a link to reviews may meet the need without loading third-party browser code.

When code is justified, prefer the smallest feature and access footprint that meets the requirement. Fewer included scripts means fewer parties granted page-level access.

One page context

A checkout form and a review widget are both connected to the same page DOM diagram.

A feature loaded onto the checkout page receives access to the shared page context; decide whether that access is necessary before evaluating the package.

Tip

Review principle

“Popular” does not answer “needed here.” First document the page-specific purpose, the data the feature can encounter, and a smaller alternative if one exists.

Check who and what you are trusting

2. Verify identity; weigh maintenance evidence

If the feature is necessary, confirm that the package or provider is the intended one. Compare the exact package identity, repository link, and ownership information with the project you meant to use. A similar-looking name is a reason to pause, not a minor spelling detail.

Then collect maintenance signals: clear ownership, documented releases, responsive issue handling, and a maintained repository can support confidence. They are evidence to weigh—not proof that a dependency is secure.

Evidence to compare

All entries below are fictional case evidence for Harbor Shop.

Identity and maintenance checks support a review but do not replace it.
Evidence areaUseful evidenceWhat it does not establish
Package identityExact name `@demo/review-widget`; repository linked from the intended projectThat a similar name, such as `@demo/review-widgit`, is the same project
OwnershipRepository owner and publishing account match the intended providerThat every published release deserves trust
MaintenanceRecent issue responses, documented releases, and clear maintainersThat popularity, age, or frequent releases prove security
Feature scopeA checkout-specific reason for the widgetThat optional code should receive checkout-page access

Warning

Pause for questionable provenance

Do not install or retain a dependency merely because its display name looks familiar. An ownership mismatch, unrelated repository, or suspiciously similar name warrants further investigation before the code reaches the browser.

Turn evidence into a proportionate action

3. Read advisory evidence in context

An advisory matters when it applies to the version selected for your application, affects behavior that reaches the browser, and has a documented remedy. Read those details rather than reacting only to a package name or severity label.

Example

Worked evidence record

Fictional advisory evidence for Harbor Shop:

Selected browser dependency chain:
@demo/review-widget version 2.4.0 → @demo/dom-utils version 1.3.0

The fictional advisory affects @demo/dom-utils version 1.3.0. It describes browser-relevant DOM handling that can create unexpected script-capable markup when the review widget processes untrusted review content. The issue has a documented fix in version 1.3.1.

Because the affected version is in the selected chain and its code reaches the checkout page, this is relevant evidence—not an abstract concern about an unrelated package.

Choose an action that fits the evidence

Use the evidence to choose a next action. Removal is strongest when the feature is unnecessary. A provenance concern calls for investigation before trusting the dependency. A relevant advisory with a documented fix calls for a reviewed update path; if that path is not suitable, remove or replace the feature.

Each action follows from a different kind of evidence.
Evidence findingJustified next action
The checkout feature is unnecessaryRemove the feature and its browser code
Identity or ownership cannot be confirmedInvestigate provenance; use a verified alternative if needed
Selected browser dependency is affected and a fix existsReview an update path that includes the documented fixed version
Only maintenance signals look reassuringContinue the review; do not treat them as approval

Practice: select the justified action

Apply the compact review

Match each fictional Harbor Shop evidence record to the most justified next action.

Tap an item and then its matching pair.

Step 4 of 8

Separate Reproducibility from Trust

Use lockfiles, integrity results, and advisory checks as focused evidence without treating any one of them as proof of trust.

Record the selected tree

What a lockfile establishes

A lockfile records the dependency versions and resolutions selected for a build. This includes transitive code: Harbor Shop may select @demo/review-widget version 2.4.0, which resolves to @demo/dom-utils version 1.3.0.

When teammates or automation use the same lockfile, they can select the same dependency tree more reliably. That is reproducibility: knowing which code was selected. It is not a judgment that the selected code deserves access to the checkout page.

Diagram showing a checkout page, a direct dependency, a transitive dependency, and a lockfile recording the selected dependency tree.

The lockfile can preserve the selected chain: @demo/review-widget 2.4.0 → @demo/dom-utils 1.3.0.

Keep the evidence claims narrow

Repeatable does not mean trustworthy

A lockfile can faithfully preserve a bad selection as well as a good one. In the fictional case evidence for this tutorial, @demo/dom-utils version 1.3.0 has a browser-relevant security issue, with a documented fix in 1.3.1. Pinning 1.3.0 makes that affected selection repeatable; it does not remove the concern.

Likewise, an integrity check can show that an obtained package matches the expected selected artifact. It cannot determine whether that artifact’s behavior is appropriate, necessary, or malicious.

What each signal can support

Treat each result as a bounded piece of evidence, then combine it with the need, identity, maintenance, and advisory review already performed.

Evidence limits in the fictional Harbor Shop case
EvidenceWhat it supportsWhat it does not establish
package-lock.json selects 1.3.0Repeatable dependency selectionThat 1.3.0 is acceptable
Artifact matches expected integrity dataThe selected artifact was obtained consistentlyThat its behavior is trustworthy
No applicable advisory reportedNo matching issue was reported by that checkThat no security concern exists

Interpret a clean result carefully

Check the limit of an advisory result

True or false: If an advisory check reports no applicable issue for the selected dependency tree, the tree has been proven trustworthy.

Apply the distinction

Separate selection evidence from trust evidence

Match each piece of evidence to the conclusion it supports.

Tap an item and then its matching pair.

Step 5 of 8

Read a Simple Script Policy

Read a simple source-based script policy for Harbor Shop and distinguish narrow source permissions from broad ones.

What script-src evaluates

A browser-enforced source rule

Content Security Policy (CSP) is enforced by the browser. A source-based policy is commonly delivered in an HTTP response header on the HTML document.

For Harbor Shop’s checkout page, script-src answers a narrow question: which script sources may execute? It evaluates a script’s source against the page origin and the policy—not who authored a package.

'self' means the document’s own origin. On https://shop.example/checkout, it can permit /assets/app.js because that URL is delivered from https://shop.example, even if the bundle contains code originally written by a third party.

One page context, checked sources

A browser checkout page receives scripts from the shop server and a separate CDN, with both paths entering the same page context.

The browser checks each script source against the policy before execution. A permitted source is not a separate or less-privileged page environment.

Tip

Keep the conclusion narrow

Allowed is a policy decision only. It does not prove that a script is trustworthy, nor does it guarantee that the resource will load successfully.

Interpret the named sources

Harbor Shop checkout response header

Assume this single enforced source-based policy is sent with the HTML document. Script URLs have no redirects, and there are no additional script permissions.

http
Content-Security-Policy: script-src 'self' https://cdn.widgets.example

Match each script to a source

Read the expressions literally:

  • 'self' permits a script from the page origin: https://shop.example.
  • https://cdn.widgets.example permits scripts from that listed HTTPS origin.
  • An external origin not listed is blocked.
  • This header does not include an inline permission, so an inline <script> is blocked in this simplified example.

Policy decisions

The following decisions use the stated assumptions for this source-based policy.

Script-source decisions for the Harbor Shop checkout document
ScriptOriginAllowed by script-src?Reason
`/assets/app.js`https://shop.exampleAllowedMatches 'self'
`https://cdn.widgets.example/metrics.js`https://cdn.widgets.exampleAllowedListed HTTPS origin
`https://analytics.example/tag.js`https://analytics.exampleBlockedExternal origin is unlisted
Inline `<script>...</script>`No URLBlockedNo inline permission is present

Avoid accidental breadth

Recognize broad permissions

A policy can become much broader than the intended source list:

  • https: permits scripts from many HTTPS origins, not just one reviewed provider.
  • * admits a very broad set of sources.
  • 'unsafe-inline' permits inline script execution in these simplified examples.

These expressions may be appropriate only when their wider permission is intentional and understood.

Same-origin-only comparison

This narrower comparison permits scripts only from the page origin. It would block the remotely loaded metrics script because its origin is not listed.

http
Content-Security-Policy: script-src 'self'

Warning

Permission is not trust

A restrictive source list reduces which script sources the browser permits. It does not turn permitted code into trustworthy code or decide whether a network request will succeed.

Classify and complete the policy

Apply the source-based policy

Complete the Harbor Shop review. Classify every script, then complete the header so it permits only the page origin and the stated CDN origin—without a broad permission.

http
# Classify under the completed source-based policy:
# /assets/app.js -> 
# https://cdn.widgets.example/metrics.js -> 
# https://other.example/tag.js -> 
# inline <script>...</script> -> 
Content-Security-Policy: script-src  

Step 6 of 8

Assign Controls to the Right Layer

Identify which layer can reduce included code, deliver a policy header, and enforce the delivered policy.

Three layers, one control

Separate the responsibilities

A restrictive script policy involves three layers:

  • Front-end work: remove an unneeded <script> tag or import, reduce dependencies, review updates, and document the script origins a page genuinely needs.
  • Serving system: sends the HTML document and its HTTP response header.
  • Browser: receives the document and enforces the delivered policy while processing it.

For Harbor Shop, deleting an unneeded third-party script from https://shop.example/checkout reduces what reaches the browser. That is valuable, but it does not itself deliver a Content-Security-Policy header.

From source change to browser enforcement

A diagram showing front-end source changes, a serving system response with a header, and browser enforcement as separate stages.

Front-end work changes what the page includes; the serving system delivers the document header; the browser applies that header.

Tip

Key timing point

The header is part of the response for the HTML document. Application JavaScript cannot retroactively add that response header or provide equivalent protection after an untrusted script has already executed.

Who owns each action?

Use these roles when reviewing a script restriction.

A control is effective only when the layer responsible for it performs its part.
LayerWhat it can doWhat it cannot establish alone
Front-end workRemove imports and script tags; reduce dependenciesThe document response header
Serving systemDeliver the HTML document and its CSP headerWhether an unnecessary package remains in application code
BrowserEnforce the received policy while processing the documentA policy that was never delivered

Confirm what the browser received

A late change is not a delivered header

A string that looks like a CSP header in application source code shows an intention, not evidence that a policy reached the browser. Likewise, JavaScript that runs after loading cannot go back in time and protect earlier document processing or code that already ran.

A supported HTML <meta> policy can be part of document markup, but it has limitations and is not the same as arbitrary late runtime injection. Do not treat adding a meta element with JavaScript as equivalent to a response-header policy. When Harbor Shop needs a response-header policy, the serving system must supply it.

Evidence on the document response

This excerpt contains the evidence to inspect: the policy appears among the HTTP headers for the HTML document, before the document body.

http
HTTP/1.1 200 OK
Content-Type: text/html
Content-Security-Policy: script-src 'self' https://cdn.widgets.example

<!doctype html>
<html lang="en">
  <head><title>Harbor Shop checkout</title></head>
  <body>
    <script src="/assets/app.js"></script>
    <script src="https://cdn.widgets.example/metrics.js"></script>
  </body>
</html>

Warning

Verify delivery, not intent

Check the actual response headers for the HTML document in a browser’s network inspection tools or in a supplied response excerpt. Do not infer effective delivery merely from a configuration string, a JavaScript variable, or a planned source-code change.

Apply the control boundaries

Audit the delivered policy

Harbor Shop is reviewing the checkout document. Read the two supplied document-response excerpts.

Response A

HTTP/1.1 200 OK
Content-Type: text/html
Content-Security-Policy: script-src 'self' https://cdn.widgets.example

<!doctype html>
<html><body>Checkout</body></html>

Response B

HTTP/1.1 200 OK
Content-Type: text/html

<!doctype html>
<html><body>
<script>
  const intendedPolicy = "Content-Security-Policy: script-src 'self' https://cdn.widgets.example";
</script>
</body></html>

In 3–5 sentences, identify which response shows that the intended enforced source-based policy is present and state why. Then assign these actions to the correct layer: removing an unnecessary dependency, delivering the policy header, and enforcing the received policy.

Write at least 120 characters (0/120).

Step 7 of 8

Recognize What the Policy Cannot Guarantee

A restrictive source-based policy is valuable defense in depth, but it cannot establish that permitted code is trustworthy or isolate it from the page.

A permitted source can still deliver harmful code

Allowed is not harmless

A restrictive source-based policy decides where a script may be loaded from. It does not inspect the script’s intent or make an allowed script less powerful inside the page.

At Harbor Shop, both of these can be permitted by a policy:

  • https://cdn.widgets.example/metrics.js, from an allowed download origin
  • /assets/app.js, from the page origin

If the provider serving metrics.js is compromised, its allowed script can still run on https://shop.example/checkout. Likewise, if /assets/app.js contains a malicious dependency, same-origin delivery does not remove that risk.

Source matching versus code trust

A policy gate allows both an external script from an approved CDN and a same-origin application bundle containing a nested dependency; each then reaches the checkout page DOM.

Source matching can allow a compromised provider script or a malicious dependency inside an allowed bundle.

A script source restriction has a narrow job

Different controls answer different questions

Once code is allowed to execute in the page, a source-based CSP does not assign separate DOM permissions to it. The policy does not mean that a third-party script may only touch “its own” page elements.

It also does not replace the other safeguards Harbor Shop needs:

  • Dependency review evaluates whether code and its provenance deserve trust.
  • Safe rendering reduces the chance that untrusted content becomes executable.
  • Server-enforced access decisions determine whether a request may read or change protected resources.

These controls address different risks; none is a substitute for the others.

Example

What this header does—and does not—decide

Policy:

Content-Security-Policy: script-src 'self' https://cdn.widgets.example

This header can allow /assets/app.js and https://cdn.widgets.example/metrics.js to load. It does not prove either file is trustworthy, inspect a dependency bundled into /assets/app.js, or isolate their access to the checkout page.

Also, script-src alone does not specify every network destination a running script may use or prevent every possible data leak. Treat it as defense in depth, not as a complete boundary around allowed code.

Practice: identify the policy boundary

Check the boundary

Which conclusion best describes a source-based policy that permits Harbor Shop’s same-origin bundle and the metrics provider?

Choose the most accurate statement.

Explain the residual risk

Apply the full risk picture

Harbor Shop delivers this response header on its checkout document:

Content-Security-Policy: script-src 'self' https://cdn.widgets.example

Later, https://cdn.widgets.example/metrics.js is compromised. Separately, reviewers discover that a malicious dependency was bundled inside /assets/app.js.

In 3–5 sentences, explain why the policy does not make either case harmless. Distinguish what the source restriction does from code review, data-access isolation, and server-enforced access control.

Write at least 180 characters (0/180).

Step 8 of 8

Make a Third-Party Script Risk Decision

Integrate a fictional Harbor Shop case packet into an actionable, evidence-based third-party script risk recommendation.

Decision frame

Turn evidence into a decision

A final risk decision is a short argument, not a score from one tool. For the Harbor Shop checkout page, connect the evidence in this order:

  1. What browser access reaches the page?
  2. Is that access necessary on checkout?
  3. What do identity, maintenance, lockfile, and advisory evidence support?
  4. Which sources does the delivered source-based policy permit?
  5. Which action belongs in front-end code, and which belongs in the serving system?
  6. What uncertainty remains after those actions?

Keep a policy result separate from a trust conclusion: Allowed means the browser permits a source under the header; it does not mean that code deserves trust.

One decision, several evidence paths

Diagram of a checkout page receiving code from a bundled dependency chain and a remote script, with separate front-end and serving-system control paths.

Trace every path that brings browser code to the page, then assign each decision to the layer that can actually make the change.

Read the evidence before recommending

Harbor Shop case packet

Use this fictional case packet. It describes the checkout document at https://shop.example/checkout; it is not a finding about real packages or services. The page origin is https://shop.example. The remote third-party script has the download origin https://cdn.widgets.example.

Evidence to weigh

Current browser-executed code and review evidence

All package identity, maintenance, and advisory details below are fictional case evidence.
Evidence areaFictional case evidenceDecision relevance
Application bundle`/assets/app.js` is required for the checkout interface and is delivered from the page origin.It is same-origin delivery, not automatic proof that every bundled author is trusted.
Dependency chain`@demo/review-widget` 2.4.0 → `@demo/dom-utils` 1.3.0 is bundled into `/assets/app.js`.The chain is browser-executed even though its delivery location is same-origin.
Need on checkoutThe review widget supports product-review display, but no review feature appears on checkout.Its page-level access has no documented checkout need.
Identity and maintenanceThe widget name and repository link match the intended fictional project, but a recent ownership transfer has no recorded Harbor Shop review.Matching identity is useful evidence; the ownership gap needs investigation.
Lockfile and advisory`package-lock.json` selects `@demo/dom-utils` 1.3.0. A fictional browser-relevant advisory affects 1.3.0; a documented fix exists in 1.3.1.The selected version is reproducible, but the advisory requires removal or a compatible update decision.
Remote metrics`https://cdn.widgets.example/metrics.js` supports checkout metrics. A business need is claimed, but provider approval and data-use review are not recorded.Its source and purpose need investigation before continued trust.

Delivered source-based policy

Current HTML document response header

http
Content-Security-Policy: script-src 'self' https://cdn.widgets.example

Tip

Assume this is one enforced policy on the HTML document, with ordinary script URLs, no redirects, and no additional directives, nonces, or hashes. Interpret only what this script-src source-based policy permits; do not treat it as a statement about code quality.

Apply the full review

Make the risk decision

Write an 80–150 word recommendation for Harbor Shop’s checkout page. Ground every conclusion in the case packet.

Include all of the following:

  • what to remove, what to update if it remains temporarily necessary, what to retain or investigate;
  • which script sources the response header permits;
  • one front-end action and one serving-system action;
  • one risk that the policy does not eliminate.

End with one explicit remaining uncertainty.

Write at least 350 characters (0/350).

Close the review

Summary

Review checklist

  • An included third-party script receives page-level capabilities, whether it arrives directly, through a dependency chain, or from a remote download origin.
  • A useful review combines necessity, provenance, maintenance, selected versions, relevant advisories, and the exact delivered policy.
  • A lockfile records selected versions; it does not establish that selected code is trustworthy.
  • A source-based script-src result is an Allowed or Blocked decision, not a safety verdict.
  • Front-end code can remove imports and script tags; the serving system must deliver an effective response-header policy.
  • Even a restrictive policy leaves residual risk from code and providers the policy already permits.

Tutorial completed

Congratulations! You completed: Evaluate the Risks of Third-Party Scripts

You completed the third-party script risk review. You can now turn access, dependency evidence, policy scope, and control ownership into a concise recommendation.

Download the App now to have access to + 5000 free courses, exercises, certificates and lots of content without paying anything!

  • 100% free online courses from start to finish

    Thousands of online courses in video, ebooks and audiobooks.

  • More than 60 thousand free exercises

    To test your knowledge during online courses

  • Valid free Digital Certificate with QR Code

    Generated directly from your cell phone's photo gallery and sent to your email

Cursa app on the ebook screen, the video course screen and the course exercises screen, plus the course completion certificate