Session 4 - Securing Software: Đừng bao giờ tin tưởng dữ liệu đầu vào!
Session 4 - Securing Software
Mục tiêu của Session
Qua ba Session trước, chúng ta đã tìm hiểu:
- Session 1: Bảo vệ tài khoản.
- Session 2: Bảo vệ dữ liệu.
- Session 3: Bảo vệ hệ thống và mạng.
Đến Session 4, trọng tâm chuyển sang bảo vệ chính phần mềm.
Đây là một trong những Session mình đánh giá hay nhất vì nó giới thiệu một nguyên tắc mà gần như mọi lập trình viên đều phải ghi nhớ:
Never Trust User Input
Đừng bao giờ tin tưởng dữ liệu do người dùng gửi lên.
Cho dù bạn là Developer hay End User, việc hiểu những kỹ thuật tấn công phổ biến sẽ giúp bạn xây dựng phần mềm an toàn hơn và tránh trở thành nạn nhân của các cuộc tấn công mạng.
1. Phishing
Khi những gì bạn nhìn thấy không phải là nơi bạn sẽ đến
Website được xây dựng bằng HTML.
Một đường dẫn thông thường có dạng:
<a href="https://harvard.edu">Harvard</a>
Người dùng nhìn thấy:
Harvard
và khi nhấn vào sẽ được chuyển tới:
https://harvard.edu
Vấn đề nằm ở đâu?
HTML cho phép phần hiển thị và địa chỉ thực sự hoàn toàn khác nhau.
Ví dụ:
<a href="https://evil.com">
https://harvard.edu
</a>
Người dùng sẽ thấy:
https://harvard.edu
Nhưng khi nhấn vào lại bị chuyển tới:
https://evil.com
hoặc một website giả mạo có giao diện gần như giống hệt.
Cách phòng tránh
Trước khi nhấn vào bất kỳ liên kết nào:
- Di chuột (Hover) lên đường link.
- Kiểm tra URL thật ở góc dưới trình duyệt.
- Quan sát kỹ tên miền.
Ví dụ:
google.com
khác hoàn toàn với
g00gle.com
hay
gooogle.com
2. Cross-Site Scripting (XSS)
Một website tìm kiếm thường hiển thị:
Bạn đã tìm kiếm:
cats
Nếu website chỉ đơn giản in dữ liệu người dùng nhập vào:
cats
thì không có vấn đề.
Điều gì xảy ra nếu người dùng nhập JavaScript?
Ví dụ:
<script>
alert("attack")
</script>
Nếu website không xử lý dữ liệu đúng cách.
Trình duyệt sẽ hiểu đây là mã JavaScript và thực thi ngay lập tức.
User Input
↓
Website
↓
Browser
↓
Execute JavaScript
Đây chính là:
Cross-Site Scripting (XSS)
Hacker có thể làm gì?
Thông qua XSS, hacker có thể:
- Đánh cắp Session Cookie.
- Thay đổi giao diện website.
- Gửi request thay người dùng.
- Chèn mã độc vào trang web.
Nếu Cookie bị đánh cắp.
Hacker hoàn toàn có thể thực hiện:
Session Hijacking
như chúng ta đã học ở Session trước.
3. SQL Injection (SQLi)
Đây là một trong những lỗ hổng nổi tiếng nhất trong lịch sử bảo mật.
Giả sử website kiểm tra đăng nhập bằng câu lệnh:
SELECT *
FROM users
WHERE username='...'
AND password='...';
Điều gì xảy ra nếu hacker nhập:
' OR '1'='1
Câu lệnh sẽ trở thành:
SELECT *
FROM users
WHERE username='admin'
AND password=''
OR '1'='1';
Do:
1 = 1
luôn đúng.
Database có thể trả về kết quả hợp lệ.
Hacker đăng nhập thành công mà không cần biết mật khẩu.
Nguy hiểm hơn
Nếu ứng dụng viết không an toàn.
Hacker còn có thể:
DROP TABLE users;
hoặc
DELETE FROM users;
để xóa toàn bộ dữ liệu.
4. Client-side Validation không đủ
Nhiều lập trình viên sử dụng HTML để ngăn người dùng nhập sai.
Ví dụ:
<input required>
hoặc
<button disabled>
Nhìn có vẻ an toàn. Thực tế thì không.
Developer Tools
Chỉ cần nhấn:
F12
Người dùng có thể chỉnh sửa HTML ngay trên trình duyệt.
Ví dụ:
disabled
↓
(xóa)
↓
Button hoạt động
hoặc
required
↓
(xóa)
↓
Submit
HTML chỉ tồn tại trên máy của người dùng.
Người dùng hoàn toàn có quyền sửa nó.
Bài học quan trọng
Client-side Validation chỉ giúp:
- Trải nghiệm người dùng tốt hơn.
- Giảm lỗi nhập liệu.
Không có giá trị bảo mật.
Mọi dữ liệu gửi lên Server đều phải được kiểm tra lại.
Đây gọi là:
Server-side Validation
5. Cross-Site Request Forgery (CSRF)
CSRF là một kiểu tấn công rất thông minh.
Hacker không cần đánh cắp tài khoản.
Họ chỉ lợi dụng việc:
Bạn đã đăng nhập sẵn.
Ví dụ.
Website có API:
https://shop.com/buy?id=100
Hacker tạo một website khác:
<img src="https://shop.com/buy?id=100">
Khi trình duyệt tải hình ảnh.
Nó sẽ tự động gửi request.
Nếu bạn vẫn còn đăng nhập.
Website sẽ nghĩ:
Đây là yêu cầu của chủ tài khoản.
và tiến hành mua hàng.
Cách phòng chống
Hầu hết framework hiện đại đều sử dụng:
CSRF Token
Mỗi Form sẽ có một Token ngẫu nhiên.
Form
↓
CSRF Token
↓
Server kiểm tra
↓
Token đúng
↓
Request hợp lệ
Website khác sẽ không thể biết Token này.
6. Viết phần mềm an toàn
Chống XSS
Không bao giờ hiển thị trực tiếp dữ liệu người dùng.
Thay vào đó.
Escape các ký tự đặc biệt.
Ví dụ:
<
thành
<
và
>
thành
>
Trình duyệt sẽ hiểu đây là văn bản.
Không phải mã HTML.
Chống SQL Injection
Không nối chuỗi SQL.
Thay vào đó.
Luôn sử dụng:
- Prepared Statement
- Parameterized Query
Database sẽ tự xử lý dữ liệu đầu vào an toàn.
Chống CSRF
Sử dụng:
- CSRF Token
- SameSite Cookie
- Kiểm tra Origin hoặc Referer khi cần
Đây đều là những cơ chế được hầu hết framework hiện đại hỗ trợ.
7. Cài đặt phần mềm an toàn
Không phải mọi ứng dụng trên Internet đều đáng tin cậy.
Một phần mềm độc hại có thể khai thác các lỗi như:
Buffer Overflow
để ghi đè bộ nhớ và chiếm quyền điều khiển hệ thống.
Digital Signature
Các kho ứng dụng chính thống như:
- Apple App Store
- Google Play
- Microsoft Store
đều yêu cầu ứng dụng được ký bằng:
Digital Signature
Điều này giúp đảm bảo:
- Phần mềm đúng từ nhà phát triển.
- Không bị chỉnh sửa trong quá trình phát hành.
- Khó bị cài cắm mã độc.
Tổng kết Session
Sau Session này, mình hiểu được:
- Không bao giờ được tin tưởng dữ liệu người dùng nhập vào.
- HTML có thể bị lợi dụng để thực hiện các cuộc tấn công Phishing.
- XSS cho phép hacker chèn JavaScript độc hại vào website.
- SQL Injection có thể làm lộ hoặc phá hủy toàn bộ cơ sở dữ liệu.
- Client-side Validation không thể thay thế Server-side Validation.
- CSRF lợi dụng phiên đăng nhập của người dùng để thực hiện các hành động ngoài ý muốn.
- Việc sử dụng Prepared Statements, Character Escaping và CSRF Token là những kỹ thuật cơ bản nhưng cực kỳ quan trọng đối với mọi Developer.
Những việc mình sẽ áp dụng ngay
Với tư cách người dùng
- [ ] Luôn kiểm tra URL thật trước khi nhấn vào bất kỳ liên kết nào.
- [ ] Chỉ cài đặt phần mềm từ App Store, Google Play, Microsoft Store hoặc nguồn chính thức của nhà phát triển.
- [ ] Hạn chế sử dụng phần mềm crack hoặc các bản cài đặt không rõ nguồn gốc.
Với tư cách Developer
- [ ] Không bao giờ tin tưởng dữ liệu từ người dùng.
- [ ] Luôn kiểm tra dữ liệu ở phía Server.
- [ ] Sử dụng Prepared Statements thay vì nối chuỗi SQL.
- [ ] Escape dữ liệu trước khi hiển thị lên giao diện.
- [ ] Bật CSRF Protection cho tất cả Form quan trọng.
Nguồn học tập
- Harvard CS50's Introduction to Cybersecurity
- Session 4 – Securing Software
Sau bốn Session, khóa học đã lần lượt đi qua những lớp bảo vệ quan trọng nhất của một hệ thống:
- Session 1: Securing Accounts
- Session 2: Securing Data
- Session 3: Securing Systems
- Session 4: Securing Software
Ở Session cuối cùng, chúng ta sẽ chuyển sang chủ đề Preserving Privacy. Hẹn gặp mọi người ở bài viết tiếp theo!
All rights reserved