Dev to webs {Coding…}

เรียนรู้การพัฒนาซอฟเวอร์ เพื่อความรู้ที่ยั่งยืน

บทที่ 34: การทดสอบและการปรับปรุงความปลอดภัยในแอปพลิเคชัน Vue.js

1. ทำไมการทดสอบและความปลอดภัยจึงสำคัญ?

การทดสอบช่วยลดข้อผิดพลาดและทำให้มั่นใจว่าแอปพลิเคชันของคุณทำงานได้อย่างถูกต้อง ขณะที่การปรับปรุงความปลอดภัยช่วยป้องกันข้อมูลของผู้ใช้และป้องกันการโจมตีจากผู้ไม่ประสงค์ดี เช่น การโจมตีแบบ XSS, CSRF, และ SQL Injection


2. การทดสอบแอปพลิเคชัน Vue.js

2.1 Unit Testing ด้วย Vue Test Utils

Vue Test Utils เป็นไลบรารีสำหรับการทดสอบ Vue Component

การติดตั้ง:

npm install @vue/test-utils jest --save-dev

ตัวอย่างการทดสอบ:

// tests/unit/HelloWorld.spec.js
import { mount } from '@vue/test-utils';
import HelloWorld from '@/components/HelloWorld.vue';

describe('HelloWorld.vue', () => {
  it('renders props.msg when passed', () => {
    const msg = 'Hello Vue.js!';
    const wrapper = mount(HelloWorld, {
      props: { msg }
    });
    expect(wrapper.text()).toMatch(msg);
  });
});

2.2 End-to-End Testing ด้วย Cypress

Cypress ใช้สำหรับการทดสอบ End-to-End เช่น การนำทางและการทำงานของแอปพลิเคชัน

การติดตั้ง:

npm install cypress --save-dev

ตัวอย่างการทดสอบ:

// cypress/integration/app.spec.js
describe('App Navigation', () => {
  it('visits the home page and navigates to about page', () => {
    cy.visit('/');
    cy.contains('About').click();
    cy.url().should('include', '/about');
    cy.contains('This is the about page.');
  });
});

3. การป้องกันการโจมตีที่พบบ่อยใน Vue.js

3.1 ป้องกัน Cross-Site Scripting (XSS)

XSS เกิดขึ้นเมื่อผู้โจมตีสามารถฝังสคริปต์ที่เป็นอันตรายลงในหน้าเว็บได้

วิธีป้องกัน:

  • ใช้ v-bind และ v-html อย่างระมัดระวัง
  • กรอง Input ที่ผู้ใช้ป้อนเข้ามา

ตัวอย่าง:

<template>
  <div>
    <p>{{ sanitizedContent }}</p>
  </div>
</template>

<script>
import DOMPurify from 'dompurify';

export default {
  props: ['content'],
  computed: {
    sanitizedContent() {
      return DOMPurify.sanitize(this.content);
    }
  }
};
</script>

3.2 ป้องกัน Cross-Site Request Forgery (CSRF)

CSRF เกิดขึ้นเมื่อคำขอที่ไม่ได้รับอนุญาตถูกส่งจากเบราว์เซอร์ของผู้ใช้

วิธีป้องกัน:

  • ใช้ CSRF Token สำหรับทุกคำขอ POST
  • ตั้งค่า SameSite สำหรับ Cookies

ตัวอย่าง:

// ตั้งค่า Axios สำหรับ CSRF Token
import axios from 'axios';

axios.defaults.headers.common['X-CSRF-Token'] = document.querySelector('meta[name="csrf-token"]').getAttribute('content');

3.3 ป้องกัน SQL Injection

SQL Injection เกิดขึ้นเมื่อข้อมูลที่ไม่ปลอดภัยถูกส่งไปยังเซิร์ฟเวอร์

วิธีป้องกัน:

  • ใช้ ORM เช่น Sequelize หรือ Mongoose
  • กรอง Input ที่ส่งไปยัง Backend

4. การเข้ารหัสข้อมูล

การเข้ารหัสช่วยปกป้องข้อมูลสำคัญ เช่น รหัสผ่าน หรือข้อมูลที่ส่งผ่าน API

การใช้ JWT สำหรับ Authentication

JWT (JSON Web Token) ช่วยให้การตรวจสอบสิทธิ์และข้อมูลเป็นไปอย่างปลอดภัย

ตัวอย่างการตั้งค่า:

// สร้าง JWT Token
const jwt = require('jsonwebtoken');
const token = jwt.sign({ userId: 123 }, 'your-secret-key', { expiresIn: '1h' });

// ตรวจสอบ JWT Token
jwt.verify(token, 'your-secret-key', (err, decoded) => {
  if (err) {
    console.error('Invalid token');
  } else {
    console.log('Decoded data:', decoded);
  }
});

5. การตั้งค่าความปลอดภัยสำหรับ Production

5.1 เปิดใช้งาน HTTPS

HTTPS ช่วยเข้ารหัสข้อมูลที่ส่งระหว่างเบราว์เซอร์และเซิร์ฟเวอร์

ตัวอย่างการตั้งค่า Nginx:

server {
  listen 443 ssl;
  server_name your-domain.com;

  ssl_certificate /path/to/certificate.crt;
  ssl_certificate_key /path/to/private.key;

  location / {
    proxy_pass http://localhost:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
  }
}

5.2 กำหนด Security Headers

ใช้ Security Headers เพื่อป้องกันการโจมตีทั่วไป

ตัวอย่างการตั้งค่าใน Nginx:

add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";

6. สรุป

ในบทนี้ คุณได้เรียนรู้เกี่ยวกับการทดสอบแอปพลิเคชันด้วย Unit Testing และ End-to-End Testing รวมถึงการปรับปรุงความปลอดภัยใน Vue.js เช่น การป้องกัน XSS, CSRF, และ SQL Injection และการตั้งค่าความปลอดภัยสำหรับ Production เทคนิคเหล่านี้ช่วยเพิ่มความมั่นใจในคุณภาพและความปลอดภัยของแอปพลิเคชัน

ในบทถัดไป เราจะพูดถึงการเพิ่มประสิทธิภาพการทำงานใน Vue.js สำหรับแอปพลิเคชันขนาดใหญ่!