DEV Community

Cover image for Full Stack Security Essentials: Preventing CSRF, Clickjacking, and Ensuring Content Integrity in JavaScript
Wilson Gouanet
Wilson Gouanet

Posted on • Originally published at wils3b.hashnode.dev on

Full Stack Security Essentials: Preventing CSRF, Clickjacking, and Ensuring Content Integrity in JavaScript

In today’s web development landscape, security is more than a buzzword—it’s a necessity. As full stack developers, we face a wide range of threats, from backend vulnerabilities to client-side exploits. In this article, we’ll explore three critical areas of JavaScript security: CSRF, clickjacking, and content integrity. We’ll discuss what each threat entails and provide practical tips on preventing them from both Node.js and in the browser environment.


1. CSRF (Cross-Site Request Forgery)

What is CSRF?

CSRF is an attack where a malicious website tricks a users browser into performing unwanted actions on a trusted site where the user is authenticated. This can lead to unexpected changes, unauthorized transactions, or data exposure.

How to Prevent CSRF

On the Node.js (Server-Side) End

  • CSRF Tokens: Use middleware (e.g., csurf in Express.js) to generate unique tokens for each session or form submission. Verify these tokens on every state-changing request.

Example using Express.js with csurf:

npm install --save csurf cookie-parser
Enter fullscreen mode Exit fullscreen mode
  const express = require('express');
  const csurf = require('csurf');
  const cookieParser = require('cookie-parser');

  const app = express();

  app.use(cookieParser());
  // Setup csurf middleware
  const csrfProtection = csurf({ cookie: true });
  app.use(csrfProtection);

  app.get('/form', (req, res) => {
    // Token must be included in the rendered form
    res.send(`<form action="/process" method="POST">
                <input type="hidden" name="_csrf" value="${req.csrfToken()}">
                <input type="text" name="data">
                <button type="submit">Submit</button>
              </form>`);
  });

  app.post('/process', (req, res) => {
    // Process the request only if CSRF token is valid
    res.send('Form data processed safely.');
  });

  app.listen(3000, () => console.log('Server running on http://localhost:3000'));

Enter fullscreen mode Exit fullscreen mode

In the Browser (Client-Side)

  • SameSite Cookies: Set your cookies with the SameSite attribute to Lax or Strict to prevent them from being sent along with cross-domain requests.

  • Custom Headers: When making AJAX requests, include custom headers (like X-Requested-With) and validate them on the server to help identify legitimate requests.


2. Clickjacking

What is Clickjacking?

Clickjacking involves tricking a user into clicking on a disguised UI element, often hidden or overlaid by another element, which can lead to unintended actions like authorizing an action, sharing data, or even performing administrative tasks.

How to Prevent Clickjacking

  • X-Frame-Options Header: Use the X-Frame-Options HTTP header to control whether your content can be embedded in frames. Options include:
    • DENY: Prevent all framing.
    • SAMEORIGIN: Allow framing only from the same origin.

Example in Express.js:

  app.use((req, res, next) => {
    res.setHeader('X-Frame-Options', 'SAMEORIGIN');
    next();
  });
Enter fullscreen mode Exit fullscreen mode
  • Content Security Policy (CSP): Use the frame-ancestors directive in your CSP headers to control what domains can embed your pages. For example:
  app.use((req, res, next) => {
    res.setHeader("Content-Security-Policy", "frame-ancestors 'self'");
    next();
  });
Enter fullscreen mode Exit fullscreen mode
  • Frame Busting Scripts: While these can be implemented using JavaScript to “bust out” of frames, they are less reliable than server-side HTTP headers and should be used as a secondary measure.

3. Content Integrity

What is Content Integrity?

Content integrity ensures that the content served by your site (e.g., scripts, stylesheets) remains unchanged from its original, trusted source. This is crucial in preventing tampering and man-in-the-middle attacks, especially when using third-party resources.

Why We Should Add It

  • Trust: Users can trust that the data and code are coming from verified sources.
  • Security: Protect against situations where third-party content may be compromised.
  • Compliance: Meet security and compliance standards that require integrity assurances.

How to Implement Content Integrity

  • Subresource Integrity (SRI): SRI allows browsers to verify that files they fetch (like JavaScript libraries) are delivered without unexpected manipulation. It involves including a cryptographic hash attribute in the HTML tag linking the resource.

Example:

  <script src="https://example.com/library.js"
          integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9Wu0g6a3JmGDXVbDt+u6p1mCA/t9zqXQGHbQ8c"
          crossorigin="anonymous"></script>
Enter fullscreen mode Exit fullscreen mode
  • CSP Hashes: When inline scripts are necessary, you can use CSP hashes to specify the expected hash of the script contents, ensuring that only approved code executes.

Conclusion

Incorporating solid security practices into your JavaScript applications is not optional—it’s fundamental. By understanding the risks associated with CSRF, clickjacking, and the importance of content integrity, you can implement robust measures that safeguard both your application and its users.

Whether you’re tweaking your Node.js backend or reinforcing client-side defenses, these strategies help ensure that your applications remain secure in an increasingly hostile online environment. Security is a continuous journey—stay vigilant, keep your dependencies updated, and always be mindful of emerging threats.


Further readings

To explore the concepts in this article further, you can read the following resources that provide more detailed information about CSRF, clickjacking, and content integrity.

Top comments (9)

Collapse
 
aayla_secura profile image
Yangren

I would add to that list also reflected Cross-Site Scripting (XSS) as it's closely related to, and often used together with, the other attacks you mentioned.

Collapse
 
wils3b profile image
Wilson Gouanet

Yes, definitely, thanks for your comment

Collapse
 
devh0us3 profile image
Alex P

Content-Security-Policy is more powerful feature than your short description, and it could help with a lot of threats

And there are much more very interesting technics ;)

just check here developer.mozilla.org/en-US/observ...

Collapse
 
wils3b profile image
Wilson Gouanet

I just put a short description in order to make the article short, I can write another article to talk more about CSP, thanks for your comment @devh0us3

Collapse
 
cc_f9f91ece754f4e626078c2 profile image
cc44599

nice

Collapse
 
wils3b profile image
Wilson Gouanet
Collapse
 
nadeem_zia_257af7e986ffc6 profile image
nadeem zia

Thanks for info, really helpful.

Collapse
 
wils3b profile image
Wilson Gouanet
Collapse
 
manuchehr profile image
Manuchehr

csurf has been depreciated already. Have you even checked these?)
Image description