1 điểm bởi GN⁺ 2025-10-05 | 2 bình luận | Chia sẻ qua WhatsApp
  • 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

  • Khi có tệp index.html, truy cập http://localhost:8080/ sẽ nhận được tệp đó
  • Có thể phục vụ từng tệp riêng lẻ hoặc tệp trong thư mục con qua các địa chỉ như http://localhost:8080/tentep.html
  • Máy chủ được dừng bằng Ctrl+C

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

 
yangeok 2025-10-05

Ngay cả phần chú thích trông cũng khá thú vị nữa,,

 
GN⁺ 2025-10-05
Ý 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 -free của cobc

  • Mọ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 ở đâu
    Trướ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ĩ

    • Ở công việc đầu tiên của tôi, tôi hỗ trợ hệ thống sản xuất bằng COBOL và hệ thống tài chính bằng Assembler
      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