- Máy chủ web tĩnh tối giản được viết bằng COBOL, cho thấy có thể lập trình hệ thống hiện đại bằng GnuCOBOL
- Cung cấp các tính năng như phục vụ tệp tĩnh từ thư mục hiện tại, tự động phát hiện kiểu MIME, xử lý mã trạng thái HTTP (200/403/404/413), chặn tấn công dò đường dẫn, ghi log request
- Đơn luồng, chỉ có thể xử lý một request tại một thời điểm, và hỗ trợ kích thước tệp tối đa 64KB
- Chạy trên môi trường tương thích POSIX (Linux/macOS/BSD) đã cài GnuCOBOL; có thể biên dịch bằng
make rồi chạy trên cổng 8080 bằng lệnh ./webserver
- Là một ví dụ về chương trình mạng viết bằng COBOL, dự án này chứng minh rằng vẫn có thể xây dựng web server hiện đại bằng một ngôn ngữ legacy
Tổng quan dự án
- Webbol là một máy chủ web tĩnh tối giản được phát triển bằng ngôn ngữ COBOL và trình biên dịch GnuCOBOL
- Mục tiêu là phục vụ tệp tĩnh đơn giản và chứng minh tính hữu dụng hiện đại của COBOL
Tính năng chính
- Phục vụ tệp tĩnh trong thư mục hiện tại
- Tự động phát hiện kiểu MIME cho các định dạng tệp phổ biến
- Hỗ trợ các mã trạng thái HTTP 200 (OK), 403 (Forbidden), 404 (Not Found), 413 (Payload Too Large)
- Ngăn chặn tấn công leo thang đường dẫn (
../ v.v.)
- Ghi log request rõ ràng bao gồm toàn bộ HTTP header
- Tự động phục vụ index.html khi có request vào đường dẫn gốc
Yêu cầu hệ thống
- Cần trình biên dịch GnuCOBOL (
cobc)
- Cần hệ điều hành tương thích POSIX (Linux, macOS, BSD)
- Cần công cụ
make
Ví dụ hoạt động và cách truy cập
Cấu trúc và thành phần tệp
- Makefile: cấu hình build
- README.md: tệp hướng dẫn mô tả
- config.cpy, socket-defs.cpy, http-structs.cpy, file-structs.cpy: định nghĩa cấu trúc cho máy chủ, socket, HTTP và xử lý tệp
- path-utils.cbl: kiểm tra và chuẩn hóa đường dẫn
- mime-types.cbl: logic xác định kiểu MIME
- file-ops.cbl: thao tác đọc tệp
- http-handler.cbl: xử lý request/response HTTP
- webserver.cbl: chương trình máy chủ chính
Các kiểu MIME được hỗ trợ
- HTML: text/html
- CSS: text/css
- JavaScript: application/javascript
- JSON, XML, plain text, PNG, JPEG, GIF, SVG, ICO, PDF v.v.
- Có thể đăng ký thêm kiểu MIME trong tệp mime-types.cbl
Tính năng bảo mật
- Ngăn chặn leo thang đường dẫn: chặn các request chứa chuỗi
..
- Giới hạn truy cập thư mục: chỉ phục vụ tệp trong thư mục hiện tại và các thư mục con
- Xử lý tệp an toàn: kiểm tra và xác thực đường dẫn trước khi truy cập hệ thống tệp
Hạn chế
- Kiến trúc đơn luồng: chỉ xử lý được một request tại một thời điểm
- Không hỗ trợ SSL/TLS (HTTPS)
- Kích thước tệp tối đa: 64KB
- Chỉ hỗ trợ cấu hình tệp tuần tự theo dòng (tệp văn bản)
- Không hỗ trợ cache, nén, range request v.v.
2 bình luận
Ngay cả phần chú thích trông cũng khá thú vị nữa,,
Ý kiến trên Hacker News
Thật vui khi thấy chế độ định dạng cố định của COBOL vẫn đang được sử dụng thực tế
COBOL có hai chế độ: free format và fixed format mode
Định dạng cố định là di sản từ thời thẻ đục lỗ, được phân chia theo các cột cụ thể
Cột 1~6: số dòng
Cột 7: ký tự chỉ thị (ví dụ:
*là chú thích, có thể xem trong mã ví dụ)Cột 8~11: marker division đặc biệt, đôi khi chiếm nhiều hơn thế (tệp ví dụ)
Cột 12~72: câu lệnh COBOL thực tế
Cột 73~80: dùng tự do cho ghi chú của lập trình viên, v.v.
Vì cấu trúc này tạo gánh nặng cho lập trình viên và công cụ ngày nay nên chế độ free format được khuyến nghị
Nhưng fixed format mode cũng có sức hút riêng, nên nếu định dùng COBOL vào năm 2025 thì tôi khuyên hãy tận hưởng đúng chất cổ điển của nó
Cột 73~80 đôi khi cũng được dùng để đánh số thứ tự để máy sắp xếp có thể xếp lại nếu thẻ bị rơi lộn xộn
Nếu muốn cảm nhận chân thực về thẻ COBOL, bạn có thể chọn COBOL card ở liên kết này
Nếu muốn cảm giác còn xưa hơn nữa, trước tiên có thể viết chương trình lên coding form rồi để trợ lý keypunch lại theo đó (mẫu)
Fortran ngày xưa cũng dùng cấu trúc cột cố định, chỉ khác cách bố trí cột
Điểm giống nhau là đều để trống cột 73~80 cho số thứ tự phục vụ việc sắp xếp thẻ, v.v.
Tôi chưa từng dùng thẻ thật, nhưng vì rất dễ làm rơi hoặc đảo thứ tự nên tôi nghĩ số thứ tự và máy sắp xếp hẳn đã cực kỳ hữu ích
Đoạn này cũng làm tôi ấn tượng
Nhưng điều thú vị là trong Makefile lại đang dùng tùy chọn
-freecủa cobcMọi người nói “hãy dùng công cụ tốt nhất cho công việc”, nhưng rồi lại không chọn COBOL cho COmmon Business Oriented probLems
Điều này cũng đúng y hệt với MUMPS
Mọi người thường bỏ qua việc bản thân có thể đưa ra những lựa chọn táo bạo
Không phải là họ không chọn COBOL, mà phần lớn là họ còn chẳng đưa nó vào diện cân nhắc
Tôi tò mò không biết người ta dùng câu “công cụ tốt nhất cho công việc” vào lúc nào và vì sao
Công ty chúng tôi đã tồn tại hơn 40~50 năm
Đến giờ vẫn có 90% hoạt động kinh doanh chạy trên nền COBOL
Nhân viên nghiệp vụ vẫn làm việc trên màn hình xanh được xây bằng RM/COBOL và RM/PANELS
Cho đến tận thập niên 2010, chúng tôi vẫn tạo HTML bằng COBOL, chỉ là không trực tiếp nhận HTTP request
Thay vào đó là đặt một lớp RPC phía sau Apache, chuyển HTTP request thành CGI rồi gửi sang COBOL
Chương trình COBOL gửi chuỗi HTML qua giao diện CGIRPC, và kết quả hiện ra thành trang web trong trình duyệt
Chúng tôi vẫn dùng cách này cho XML service, v.v. để bổ trợ cho các webapp hiện có
Thành thật mà nói thì dự án này còn ngầu hơn trải nghiệm đó rất nhiều
Thật thú vị khi thấy gần như mọi dòng mã đều có chú thích
Điều đó khiến tôi nghĩ lại về tiền đề của câu “code nên tự làm tài liệu cho chính nó”
Câu đó ngầm giả định rằng người đọc code biết ngôn ngữ đó, và trong một số trường hợp thì việc “self-documenting” là khả thi
Có lẽ ai quen COBOL sẽ nói rằng COBOL cũng hoàn toàn có thể self-documenting, nhưng tôi thì không chắc
Trong git commit d9a5e3e có nội dung “đã thêm chú thích để những người tò mò có thể hiểu từng dòng đang làm gì”
Tôi nghĩ câu “code được đọc bởi người biết ngôn ngữ đó” còn tùy ngữ cảnh
Với code viết để tự học hoặc để người khác học cùng, việc chú thích từng dòng làm gì là điều tự nhiên
Ngược lại, trong môi trường chuyên nghiệp, thường sẽ tốt hơn nếu quản lý theo cấu trúc và ít chú thích hơn, với giả định là cả nhóm đều hiểu rõ ngôn ngữ
Tôi từng thấy có người trong ngành ngân hàng bảo COBOL vốn giống ngôn ngữ tự nhiên nên tự nó đã là self-documenting, và tôi nghe mà suýt bật cười
Có vẻ như đây là một câu đùa, nhưng tôi thật sự thấy tò mò nên muốn hỏi
Không biết có ai hiểu rõ về các bảo đảm liên quan đến bảo mật trong COBOL không
Ví dụ, COBOL có cho phép truy cập vượt phạm vi bộ nhớ hay không, và mức độ rủi ro tạo ra lỗ hổng bảo mật do “sơ suất” như trong C hay Rust là thế nào
Nếu truy cập vượt phạm vi bộ nhớ trong COBOL thì với compiler hiện đại sẽ báo lỗi, còn nếu vẫn biên dịch hoặc chạy được thì sẽ dẫn đến lỗi runtime hoặc crash gần như ngay lập tức
Tuy vậy, COBOL có tính năng reference modification nên vẫn tồn tại khả năng cố ý tham chiếu đến vùng nhớ nằm ngoài ranh giới dữ liệu
Nó không hoàn toàn an toàn, nhưng vì nhiều lỗi và cách dùng sai bị bắt ngay từ bước biên dịch nên tỷ lệ xảy ra sai sót do vô ý cũng thấp đi khá nhiều
Khi nhìn vào http handler tôi cũng thắc mắc điều tương tự
Tôi cảm giác nếu thiếu dấu cách giữa method và path thì có thể sẽ có nguy cơ buffer overrun
Tôi chưa tự chạy thử, nhưng đây là kiểu lo ngại đã nảy ra trong đầu
Tôi muốn hiểu thêm
CALL "socket"thực sự làm gìCALL là gọi subprogram, nhưng tôi không biết
"socket"được định nghĩa ở đâuTrước đây tôi cũng từng nghĩ đến chuyện thử làm một webserver bằng COBOL, nhưng chỉ đọc thấy trong GnuCOBOL FAQ là có thể làm bằng CGI rồi không đi tiếp nữa (xem FAQ)
Tôi muốn đào sâu hơn vào dự án này
Cảm giác thực sự rất thú vị
"socket"có thể là một lời gọi system callĐã có thời COBOL được dùng làm backend cho website của một số cơ quan chính phủ và doanh nghiệp
Các website thời đó có thể dễ dàng được nhận ra nhờ kiểu HTML xuất ra theo định dạng fixed-width 100 cột rất đặc trưng
Tôi từng nghĩ ngôn ngữ nào rồi cũng có thể dùng để lập trình được, nhưng nhìn dự án COBOL này thì đến mức Assembly còn thấy gọn gàng và thanh lịch hơn
Jms Dnns! Đây thực sự là một dự án tuyệt vời giúp mở rộng cách suy nghĩ
Với kinh nghiệm từng xử lý những chồng mã nguồn cao đến vài chục cm của cả hai ngôn ngữ, tôi thấy phía COBOL dễ sắp xếp trong đầu hơn nhiều
Dĩ nhiên điều này có thể khác nhau tùy người
Dự án thật sự rất tuyệt
Nếu có mẹo nào để nhập môn COBOL thì tôi rất muốn nghe
Giờ thì chúng ta đã tiến thêm một bước tới tầm nhìn của COBOL on Cogs
Có thể xem thêm tại coboloncogs.org