Web Security Basics Every Developer Must Know — cod-ai.com

March 2026 · 17 min read · 3,991 words · Last Updated: March 31, 2026Advanced

Ba năm trước, tôi đã chứng kiến một startup mà tôi tư vấn mất tất cả chỉ trong 72 giờ. Không phải từ một cuộc tấn công tinh vi của quốc gia hay một lỗ hổng zero-day nào đó làm tốn giấy mực. Họ đã mất toàn bộ cơ sở dữ liệu khách hàng, danh tiếng và cuối cùng là cả doanh nghiệp của họ vì một lỗ hổng SQL injection duy nhất mà một lập trình viên trẻ đã giới thiệu trong một đợt triển khai vội vàng vào thứ Sáu. Cuộc tấn công xảy ra vào sáng thứ Hai. Đến chiều thứ Tư, họ đã soạn thảo giấy tờ phá sản.

💡 Những Điều Quan Trọng

  • Bẫy Xác Thực Đánh Bại Mọi Người
  • Cross-Site Scripting: Lỗ Hổng Không Bao Giờ Chết
  • SQL Injection: Lỗ Hổng Cổ Xưa Vẫn Có Hiệu Quả
  • HTTPS Không Còn Tùy Chọn Nữa

Tôi là Sarah Chen, và tôi đã dành 12 năm qua làm kiến trúc sư bảo mật tại các công ty từ những startup nhỏ đến các doanh nghiệp Fortune 500. Tôi đã thấy những sai lầm có thể ngăn chặn làm hỏng doanh nghiệp nhiều lần. Phần gây khó chịu nhất? Hầu hết những thảm họa này có thể đã được tránh nếu có kiến thức bảo mật cơ bản chỉ mất ít thời gian học hơn khung JavaScript trung bình của bạn.

Đây là điều mà không ai nói cho bạn khi bạn đang học lập trình: bảo mật không phải là một chủ đề nâng cao mà bạn xử lý sau khi bạn đã hoàn thành mọi thứ khác. Nó là nền tảng. Nó giống như việc học lái xe mà không hiểu rằng đèn đỏ có nghĩa là dừng lại. Bạn có thể thoát khỏi nó một thời gian, nhưng cuối cùng, bạn sẽ gây ra một tai nạn thảm khốc.

Theo Báo cáo Điều Tra Vi phạm Dữ liệu 2023 của Verizon, 74% các vi phạm liên quan đến yếu tố con người, bao gồm sai sót, lạm dụng hoặc kỹ thuật xã hội. Nhưng đây là điều thú vị: khi họ phân tích các cuộc tấn công ứng dụng web cụ thể, họ đã phát hiện ra rằng 86% khai thác các lỗ hổng đã được tài liệu hóa và có thể ngăn chặn trong hơn một thập kỷ. Chúng ta không thua những kẻ tấn công tinh vi. Chúng ta thua vì sự thiếu hiểu biết của chính mình về những điều cơ bản.

Bẫy Xác Thực Đánh Bại Mọi Người

Để tôi nói với bạn về xác thực, vì đây là nơi tôi thấy các lập trình viên mắc sai lầm nghiêm trọng đầu tiên. Họ coi nó như một tính năng kiểm tra thay vì là nền tảng của toàn bộ mô hình bảo mật của họ. Tôi từng xem qua mã mà một lập trình viên đã triển khai xác thực bằng cách kiểm tra xem địa chỉ email của người dùng có tồn tại trong cookie hay không. Không phải là cookie đã ký. Không phải là mã thông báo được mã hóa. Chỉ là một địa chỉ email văn bản thuần mà bất kỳ ai cũng có thể chỉnh sửa trong công cụ phát triển của trình duyệt của họ.

Khi tôi chỉ ra điều này, lập trình viên đã nói, "Nhưng nó hoạt động!" Và đó là vấn đề ngay tại đó. Các lỗ hổng bảo mật không tự thông báo mình bằng các thông báo lỗi. Chúng hoạt động hoàn hảo cho đến khi ai đó khai thác chúng.

Dưới đây là điều mà xác thực đúng cách thực sự yêu cầu. Đầu tiên, bạn cần hiểu sự khác biệt giữa xác thực (chứng minh bạn là ai) và ủy quyền (chứng minh những gì bạn được phép làm). Tôi đã thấy các hệ thống sản xuất mà những khái niệm này bị mờ nhòa đến nỗi việc khắc phục một vấn đề bảo mật đã tạo ra ba vấn đề khác.

Bảo mật mật khẩu là điều không thể thỏa thuận. Bạn phải sử dụng một thuật toán hash mật khẩu thích hợp như bcrypt, scrypt, hoặc Argon2. Không phải SHA-256. Không phải MD5. Chắc chắn không phải văn bản thuần. Tôi vẫn gặp những cơ sở dữ liệu vào năm 2026 mà mật khẩu được lưu trữ dưới dạng văn bản thuần, và mỗi lần như vậy, lập trình viên nói với tôi rằng họ "không nghĩ ai đó thực sự sẽ cố gắng hack họ." Điều đó giống như việc để cửa trước của bạn không khóa vì bạn không nghĩ rằng có ai đó thực sự sẽ ăn cắp bạn.

Các con số ở đây rất rõ ràng. Theo báo cáo Trung tâm Tài nguyên Trộm Cắp Danh Tính 2023, có 3.205 vụ vi phạm dữ liệu ảnh hưởng đến hơn 353 triệu nạn nhân chỉ riêng tại Hoa Kỳ. Khi các nhà nghiên cứu phân tích dữ liệu bị vi phạm, họ phát hiện ra rằng trong các trường hợp mà phương pháp lưu trữ mật khẩu được công bố, 43% sử dụng phương pháp hash không đầy đủ hoặc không có bất kỳ phương pháp hashing nào.

Quản lý phiên là nơi mọi thứ trở nên thú vị. Bạn cần tạo ra các mã thông báo phiên ngẫu nhiên an toàn từ mặt mã hóa. Các trình tạo số ngẫu nhiên tích hợp trong hầu hết các ngôn ngữ không an toàn từ mặt mã hóa. Trong Node.js, bạn muốn dùng crypto.randomBytes(), không phải Math.random(). Trong Python, bạn muốn dùng secrets.token_hex(), không phải random.random(). Tôi đã thấy các mã thông báo phiên được tạo ra với dấu thời gian và ID người dùng nối với nhau. Một kẻ tấn công có thể dự đoán chúng trong vài giây.

Các mã thông báo phiên của bạn nên có ít nhất 128 bit độ ngẫu nhiên. Chúng nên được truyền chỉ qua HTTPS. Chúng nên có cờ HttpOnly được thiết lập để JavaScript không thể truy cập. Chúng nên có cờ Secure được thiết lập để không bao giờ được gửi qua các kết nối không được mã hóa. Chúng nên có thuộc tính SameSite được thiết lập để ngăn chặn các cuộc tấn công CSRF. Và chúng nên hết hạn. Tôi khuyên bạn rằng 30 phút không hoạt động cho các ứng dụng nhạy cảm, có thể 24 giờ cho các tình huống ít rủi ro hơn.

Cross-Site Scripting: Lỗ Hổng Không Bao Giờ Chết

Các cuộc tấn công XSS giống như gián. Chúng đã xuất hiện mãi mãi, ai cũng biết về chúng, nhưng vẫn tiếp tục xuất hiện trong mã sản xuất. OWASP Top 10 đã bao gồm các lỗ hổng XSS kể từ khi bắt đầu vào năm 2003, và nó vẫn tồn tại vào năm 2026. Đó là 21 năm của cùng một lỗ hổng có thể ngăn chặn được.

"Bảo mật không phải là một chủ đề nâng cao mà bạn xử lý sau khi bạn đã hoàn thành mọi thứ khác. Nó là nền tảng. Nó giống như việc học lái xe mà không hiểu rằng đèn đỏ có nghĩa là dừng lại."

Tôi nhớ việc kiểm tra một ứng dụng y tế hiển thị ghi chú của bệnh nhân được nhập bởi các bác sĩ. Các lập trình viên đã xây dựng một trình soạn thảo văn bản phong phú cho phép định dạng cơ bản. Nghe có vẻ hợp lý, phải không? Ngoại trừ họ đã lấy đầu vào HTML đó và hiển thị trực tiếp trên trang mà không có bất kỳ sự vệ sinh nào. Tôi đã chứng minh lỗ hổng bằng cách nhập một ghi chú bệnh nhân chứa một thẻ script. Mã script đó có thể đã đánh cắp mã thông báo phiên, sửa đổi hồ sơ y tế, hoặc khai thác dữ liệu bệnh nhân. Các lập trình viên đã sốc. Họ chưa bao giờ xem xét rằng một bác sĩ có thể có ý đồ xấu, hoặc rằng máy tính của một bác sĩ bị xâm phạm có thể chèn mã độc hại.

Đây là nguyên tắc cơ bản: không bao giờ tin tưởng vào đầu vào của người dùng. Không bao giờ. Không từ bác sĩ, không từ quản trị viên, không từ CEO của bạn. Mỗi mảnh dữ liệu đến từ bên ngoài ứng dụng của bạn đều có khả năng độc hại cho đến khi được chứng minh ngược lại.

Có ba loại XSS bạn cần hiểu. Stored XSS là khi mã độc hại được lưu trong cơ sở dữ liệu của bạn và được thực thi mỗi khi ai đó xem dữ liệu đó. Reflected XSS là khi mã độc hại trong tham số URL ngay lập tức được phản ánh trở lại trong phản hồi. DOM-based XSS là khi JavaScript phía client lấy đầu vào của người dùng và chèn nó vào trang mà không có sự vệ sinh thích hợp.

Giải pháp không khó, nhưng nó đòi hỏi kỷ luật. Bạn cần phải thoát đầu ra dựa trên ngữ cảnh. Nếu bạn đang chèn dữ liệu vào nội dung HTML, bạn cần mã hóa thực thể HTML. Nếu bạn đang chèn dữ liệu vào chuỗi JavaScript, bạn cần thoát JavaScript. Nếu bạn đang chèn dữ liệu vào URL, bạn cần mã hóa URL. Nếu bạn đang chèn dữ liệu vào CSS, bạn cần thoát CSS.

Các khung hiện đại giúp đỡ việc này. React, Vue và Angular đều tự động thoát đầu ra. Nhưng chúng không phải là phép thuật. Nếu bạn sử dụng dangerouslySetInnerHTML trong React hoặc v-html trong Vue, bạn đang vượt qua những biện pháp bảo vệ đó. Tôi đã thấy các lập trình viên sử dụng những tính năng này vì họ "cần" phải hiển thị HTML, mà không hiểu rằng họ đã mở ra một lỗ hổng XSS.

Chính sách Bảo mật Nội dung là hàng rào thứ hai của bạn. CSP là một tiêu đề HTTP cho trình duyệt biết các nguồn nội dung nào là hợp lệ. Bạn có thể chặn các script nội tuyến hoàn toàn, hạn chế các miền nào có thể tải JavaScript, và ngăn chặn một lớp toàn bộ các cuộc tấn công XSS. Theo nghiên cứu của Google, việc triển khai một CSP chặt chẽ có thể ngăn chặn khoảng 95% các cuộc tấn công XSS. Tuy nhiên, theo kinh nghiệm của tôi, chưa đến 30% các ứng dụng mà tôi kiểm tra có bất kỳ CSP nào, và hầu hết trong số đó quá permisive đến mức chúng gần như vô dụng.

SQL Injection: Lỗ Hổng Cổ Xưa Vẫn Có Hiệu Quả

SQL injection lẽ ra đã biến mất. Nó đã được hiểu rõ từ những năm 1990. Bobby Tables đã trở thành một meme trong hơn một thập kỷ. Thế nhưng, theo Báo cáo Tình trạng Internet 2023 của Akamai, các nỗ lực SQL injection chiếm 65% tất cả các cuộc tấn công ứng dụng web. Tại sao? Bởi vì nó vẫn còn hiệu quả.

Loại Lỗ HổngMức Độ Rủi RoĐộ Khó Ngăn ChặnNguyên Nhân Thường Gặp
SQL InjectionQuan TrọngDễĐầu vào không được vệ sinh trong các truy vấn
Xác Thực YếuQuan TrọngDễChính sách mật khẩu kém, không có MFA
XSS (Cross-Site Scripting)CaoVừaNội dung người dùng không được thoát trong HTML
Kiểm Soát Truy Cập Bị HỏngCaoVừaCác kiểm tra ủy quyền thiếu sót
Cấu Hình Bảo Mật SaiTrung BìnhDễCài đặt mặc định, các điểm cuối lộ ra

Tôi từng tư vấn cho một công ty thương mại điện tử đã hoạt động được tám năm. Họ đã xử lý hàng triệu giao dịch. Họ có một đội ngũ 15 lập trình viên. Và chức năng tìm kiếm của họ bị tổn thương với SQL injection. Mã nhìn giống như thế này: họ lấy thuật ngữ tìm kiếm từ tham số URL và nối nó trực tiếp vào một truy vấn SQL. Không có tham số hóa. Không có xác thực đầu vào. Không có gì hết.

Khi tôi chứng minh lỗ hổng...

C

Written by the Cod-AI Team

Our editorial team specializes in software development and programming. We research, test, and write in-depth guides to help you work smarter with the right tools.

Share This Article

Twitter LinkedIn Reddit HN

Related Tools

SQL Formatter & Beautifier — Free Online Tool Top 10 Developer Tips & Tricks Chris Yang — Editor at cod-ai.com

Related Articles

Hash Functions Explained for Developers (MD5, SHA-256, bcrypt) Web Performance Optimization: Make Your Site Fast — cod-ai.com Clean Code: 10 Principles That Make You a Better Developer — cod-ai.com

Put this into practice

Try Our Free Tools →