[Ký sự NCSC] Giai đoạn 2: Xây Web PHP Cơ bản | Phần 1 – Phân tích yêu cầu & Cài đặt môi trường

turned on computer monitor displaying text

🐔 “Ký sự NCSC” là chuyên mục bài viết về thời gian mình thực tập tại Trung tâm Giám sát An toàn Không gian mạng Quốc gia (National Cyber Security Center), thuộc Cục An toàn Thông tin, Bộ Thông tin và Truyền thông. Nghe tên Trung tâm thì khủng thế thôi, còn mình thì… gà, đến để “cục tác lá chanh”, học từ những bài học đơn giản nhất.

Trong chuyên mục này, mình sẽ chia sẻ những nhiệm vụ và bài tập mình đã trải qua, cũng như một vài kỷ niệm vui vẻ hay ho trong thời gian ở Trung tâm.

Bài học thứ nhất là đừng dùng Virtual Box. Bài học thứ hai là đừng dùng Apache mà hãy dùng Nginx!

Sếp tôi cười và chỉ bí kíp như vậy, cái ngày tôi chật vật lắm mới set up xong môi trường (nói nhỏ: 2 tuần – thế là hết xừ nó thời gian dự kiến hoàn thành rồi còn gì nữa!). Tôi nghe mà cảm thấy chết trong lòng nhiều chút, nhưng những thứ này hoá ra chẳng là gì so với bể dâu tôi sắp phải đối mặt tiếp theo.

Tôi chưa từng tự mình làm một cái web đầy đủ từ A đến Z, cả front-end lẫn back-end, chưa viết PHP bao giờ, lại càng chưa từng phải deploy cái web đến một con Linux server chả có gì ngoài cái terminal.

Trong cả lộ trình thực tập, cá nhân tôi đánh giá task này là thứ “ác mộng” nhất tôi từng gặp phải. Hồi ấy, tôi ăn PHP, ngủ PHP, refactor code đến đần cả người. Có giọt nước mắt đã rơi trên bàn phím, và nhiều hơn số đó đã âm thầm rơi trong lòng tôi. Vậy mà web vẫn… lỗi tùm lum.

Cái số tôi cứ muốn cầu toàn là web phải không có lỗ hổng nào (!), nên tôi tự làm khổ mình bằng cách vừa học trên PortSwigger (task của Giai đoạn 3), vừa tự “đấm vào mõm mình” (aka. cái web này), sửa lại những chỗ thiếu bảo mật. Tự tôi đánh giá đây là một cách học tuyệt vời và không kém phần cay đắng: Nó khiến cho tôi “nhớ mặt” lỗ hổng như cái cách bạn nhớ người yêu cũ.

Kế hoạch đề ra là 2 tuần, tôi làm trong tháng rưỡi. Cuối cùng thì cũng xong, và tôi… chưa bị đấm (!). May mắn là tôi có thói quen ghi lại quá trình của mình, nên hôm nay có thứ chia sẻ cùng với bạn. Mong là sẽ có thứ gì đó hữu ích với bạn, chí ít là tránh được việc không đi theo (rất nhiều!) vết xe đổ của tôi.

Công nghệ sử dụng

Dựng trên môi trường: (Không sử dụng các công cụ hỗ trợ sẵn như XAMPP,…)

  • Máy ảo trên VMWare/ VirtualBox
  • Hệ điều hành Linux Server (CentOS, Ubuntu…) (không có GUI)
  • Web server: Apache hoặc Nginx
  • Ngôn ngữ PHP, khuyến khích sử dụng PHP thuần
  • CSDL: MySQL. Hiểu về cách sử dụng CSDL, các bảng, các giá trị, khóa ….*

Trường hợp khác:

  • Các bạn có thể lựa chọn code web bằng .Net hoặc Java nếu không muốn dùng PHP
  • Sử dụng hệ điều hành Windows Server, hoặc Linux distro tương ứng với ngôn ngữ, sử dụng CSDL tùy chọn

Đọc yêu cầu, tôi thấy mình có khá nhiều lựa chọn. Câu chuyện ở đây là việc nhiều lựa chọn chỉ hữu ích với người đã biết một số công nghệ nhất định, chứ cái quái gì cũng không biết (như tôi) thì nhiều lựa chọn chỉ tổ đau đầu. Vì thế, sau một hồi tìm kiếm hỏi han, tôi quyết định đi đến việc sử dụng một trong những tech stack nổi tiếng là LAMP.

Nếu bạn đã biết (hay tốt hơn là thạo) một công nghệ gì đó, tôi khuyến khích là bạn nên chọn nó, rồi tìm cách tích hợp với những phần khác sau. Tôi chỉ dừng ở biết tên và dùng mấy công nghệ này như người dùng thường, chứ không phải là một lập trình viên, nên cũng chưa dám nhận là mình biết.

LAMP cấu thành từ Linux, Apache, MySQL và PHP. Không liên quan lắm, nhưng tôi thấy nó hay vì logo của những công nghệ này toàn là những bạn động vật: cánh cụt, cá heo, voi và chim (lông vũ). Nguồn: Stackify.

Như câu nói từ sếp khiến tôi gục ngã trên kia, có thể bạn nên cân nhắc chọn Nginx thay vì Apache. Lí do tại sao thì tôi không biết – nhưng quy trình thiết đặt Apache tôi đánh giá là tương đối phức tạp.

Về phần lập trình, yêu cầu viết “PHP thuần” tức là bạn không được phép sử dụng framework. Framework (khung phần mềm) bao gồm các đoạn code được viết sẵn cùng với các thư viện, tệp hình ảnh và tài liệu tham khảo được đóng thành một gói. Gói này có thể sửa đổi để phù hợp với nhu cầu cụ thể của từng dự án.

Hiểu nôm na là thay vì chỉ tập trung viết các chức năng trên nền abstraction – thứ có được nhờ các framework giấu đi và làm hộ cho bạn những phần config phức tạp và mệt mỏi – giờ bạn phải làm tuốt. Tôi thì “điếc không sợ súng”, chưa dùng framework bao giờ nên tôi cứ thế đâm đầu vào viết PHP thôi.

Tính năng

Yêu cầu dựng web có các chức năng cơ bản:

  • Đăng ký
  • Đăng nhập
  • Đăng xuất
  • Tìm kiếm
  • Thêm, sửa, xóa bài đăng (tiêu đề, nội dung bài đăng) (người dùng thường có thể sử dụng)
  • Thêm, sửa, xóa người dùng
  • Thiết kế CSDL phù hợp, có sử dụng khóa để liên kết các bảng

Phần tính năng này khá dễ hiểu, nên tôi sẽ không giải thích gì nhiều thêm.

Viết PHP là viết gì?

Về cơ bản là PHP giống như JavaScript, nếu như bạn đã từng học làm web với HTML, CSS và JavaScript. Code PHP có thể được nhúng trong file HTML, và ngược lại, HTML cũng có thể được nhúng trong một file PHP.

Ví dụ về PHP nhúng trong một file HTML.

Trong khi HTML đảm nhận việc chứa nội dung trang web, CSS là “cái áo” cho trang, phần code PHP sẽ thực hiện xử lý các logic, giống như JavaScript. Trong một file, một nguyên tắc tốt là bạn nên nhóm riêng các đoạn PHP ra một khối, và HTML riêng ra khối khác – hạn chế tối đa việc liên tục đan xen hai ngôn ngữ, sẽ khiến cho chương trình khó đọc.

Rốt cục mọi thứ hoạt động thế nào nhỉ?

Lần đầu xây web “full sờ-nắc” nên tôi cũng nhiều phen bỡ ngỡ. Về cơ bản là bạn sẽ viết code cho trang web. Phần mã nguồn này sẽ bao gồm việc xử lý cả front-end (phía người dùng nhìn thấy) và back-end (phía gọi đến server và database). Bạn sẽ cần phải thiết kế cả cơ sở dữ liệu, thiết lập nó, và viết code để gửi truy vấn cho đúng. Bạn cũng sẽ cần phải thiết đặt cho web server, công nghệ sẽ giúp bạn “host” website của mình.

Cái hình này hơi nhiều thông tin, nhưng bạn chỉ cần quan tâm đến các thành phần “Web server”, “CGI scripting”, “Database” và “Linux kernel” mà thôi.

Những nguyên liệu cần thiết

Để có thể làm cái task tốt nhất, tôi khuyến khích bạn nên để riêng môi trường phát triển và môi trường máy chủ. Theo đó, tôi cũng sẽ tạm chia những thứ bạn cần chuẩn bị ra làm 2 phần:

Phần 1 – Máy phát triển (Development machine)

Máy này dùng để bạn viết code, thử cái này cái kia, trước khi đưa lên máy chủ. Ở trường hợp này chính là cái máy local của bạn.

Yêu cầu của các anh chị là không được dùng XAMPP, nhưng không ai cấm là bạn không được dùng nó trong môi trường phát triển. Vậy nên tôi đã dùng nó để trực tiếp theo dõi những thay đổi của web mình trong giai đoạn đầu một cách dễ dàng hơn.

  • XAMPP. Trong này đã có sẵn PHP, MariaDB, Apache và Perl. Tải về và cài đặt.

Phần 2 – Máy chủ (Server)

Máy này là máy sẽ lưu (host) cái web thành phẩm của bạn. Theo yêu cầu nó là máy ảo Linux server, nên nó sẽ là cái máy ảo bạn cài cắm sau này trong VMWare hoặc VirtualBox.

  • VMWare hoặc VirtualBox. Tôi gặp khá nhiều vấn đề với VirtualBox, với cái Network adapter của nó. Bạn có thể cân nhắc phương án còn lại, như bài học ở đầu post này.
  • Ubuntu Server (hoặc Linux distro khác tuỳ ý). Nhớ là phải tải bản server chứ không phải bản có GUI (như Ubuntu Desktop) đâu nhé.

Sau khi thiết lập được máy chủ, bạn sẽ cần phải cài những thứ sau đây:

  • Apache. Làm theo hướng dẫn ở đây.
  • PHP. Làm theo hướng dẫn ở đây.
  • MySQL. Tiếp tục làm theo hướng dẫn ở đây.

Hãy đảm bảo là mọi thứ đều đã được set up và chạy tốt trước khi tiếp tục nhé.

In