1 คะแนน โดย GN⁺ 2025-10-05 | 2 ความคิดเห็น | แชร์ทาง WhatsApp
  • เว็บเซิร์ฟเวอร์สแตติกขนาดเล็กที่เขียนด้วย COBOL ซึ่งแสดงให้เห็นว่าสามารถทำระบบโปรแกรมมิงสมัยใหม่ได้ด้วย GnuCOBOL
  • มีความสามารถอย่าง ให้บริการไฟล์สแตติกจากไดเรกทอรีปัจจุบัน, ตรวจจับ MIME type อัตโนมัติ, รองรับ HTTP status code (200/403/404/413), ป้องกันการโจมตีแบบ path traversal, แสดงบันทึกคำขอ เป็นต้น
  • เป็นแบบ เธรดเดียว จึงประมวลผลได้ครั้งละหนึ่งคำขอ และรองรับขนาดไฟล์สูงสุด 64KB
  • ทำงานได้บน สภาพแวดล้อมที่เข้ากันได้กับ POSIX (Linux/macOS/BSD) ที่ติดตั้ง GnuCOBOL แล้ว โดยคอมไพล์ด้วย make และรันด้วยคำสั่ง ./webserver บนพอร์ต 8080
  • เป็นตัวอย่างของโปรแกรมเครือข่ายที่เขียนด้วยภาษา COBOL และเป็นโปรเจกต์ที่ พิสูจน์ได้ว่าแม้แต่ภาษาเลกาซีก็สามารถสร้างเว็บเซิร์ฟเวอร์สมัยใหม่ได้

ภาพรวมโปรเจกต์

  • Webbol เป็นเว็บเซิร์ฟเวอร์สแตติกขนาดเล็กที่พัฒนาด้วยภาษา COBOL และคอมไพเลอร์ GnuCOBOL
  • เป้าหมายคือให้บริการไฟล์สแตติกแบบง่าย ๆ และพิสูจน์การใช้งาน COBOL ในบริบทสมัยใหม่

ฟีเจอร์หลัก

  • เสิร์ฟไฟล์สแตติก จากไดเรกทอรีปัจจุบัน
  • ตรวจจับ MIME type อัตโนมัติ สำหรับรูปแบบไฟล์ทั่วไป
  • รองรับ HTTP status code 200 (OK), 403 (Forbidden), 404 (Not Found), 413 (Payload Too Large)
  • ป้องกันการโจมตีแบบ path traversal (../ เป็นต้น)
  • บันทึกคำขออย่างสะอาด พร้อม HTTP header ทั้งหมด
  • เมื่อร้องขอที่ root path จะให้บริการ index.html เป็นค่าเริ่มต้น

ความต้องการของระบบ

  • ต้องมี คอมไพเลอร์ GnuCOBOL (cobc)
  • ต้องใช้ระบบปฏิบัติการที่เข้ากันได้กับ POSIX (Linux, macOS, BSD)
  • ต้องมีเครื่องมือ make

ตัวอย่างการทำงานและวิธีเข้าถึง

  • หากมีไฟล์ index.html เมื่อเข้า http://localhost:8080/ ระบบจะให้บริการไฟล์ดังกล่าว
  • สามารถเข้าถึงไฟล์เดี่ยวหรือไฟล์ในไดเรกทอรีย่อยได้ผ่าน http://localhost:8080/ชื่อไฟล์.html เป็นต้น
  • ปิดเซิร์ฟเวอร์ด้วย Ctrl+C

โครงสร้างและการจัดไฟล์

  • Makefile: การตั้งค่าการบิลด์
  • README.md: ไฟล์คำอธิบายและคู่มือ
  • config.cpy, socket-defs.cpy, http-structs.cpy, file-structs.cpy: นิยามโครงสร้างของเซิร์ฟเวอร์ ซ็อกเก็ต HTTP และการจัดการไฟล์
  • path-utils.cbl: การตรวจสอบและจัดระเบียบพาธ
  • mime-types.cbl: ตรรกะการระบุ MIME type
  • file-ops.cbl: งานอ่านไฟล์
  • http-handler.cbl: การจัดการคำขอ/การตอบกลับ HTTP
  • webserver.cbl: โปรแกรมเซิร์ฟเวอร์หลัก

MIME type ที่รองรับ

  • HTML: text/html
  • CSS: text/css
  • JavaScript: application/javascript
  • JSON, XML, Plain text, PNG, JPEG, GIF, SVG, ICO, PDF เป็นต้น
  • สามารถเพิ่ม MIME type เพิ่มเติมได้ในไฟล์ mime-types.cbl

ฟีเจอร์ด้านความปลอดภัย

  • ป้องกัน path traversal: บล็อกคำขอที่มีลำดับ ..
  • จำกัดการเข้าถึงไดเรกทอรี: ให้บริการเฉพาะไฟล์ในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย
  • จัดการไฟล์อย่างปลอดภัย: ตรวจสอบและยืนยันความถูกต้องของพาธก่อนเข้าถึงระบบไฟล์

ข้อจำกัด

  • ทำงานแบบ single-threaded: ประมวลผลได้ครั้งละหนึ่งคำขอ
  • ไม่รองรับ SSL/TLS (HTTPS)
  • ขนาดไฟล์สูงสุด: 64KB
  • รองรับเฉพาะไฟล์แบบ line sequential (ไฟล์ข้อความ)
  • ไม่รองรับแคช การบีบอัด range request เป็นต้น

2 ความคิดเห็น

 
yangeok 2025-10-05

คอมเมนต์ก็ดูมีหน้าตาแปลกดีเหมือนกัน,,

 
GN⁺ 2025-10-05
ความคิดเห็นบน Hacker News
  • รู้สึกดีที่ได้เห็นการใช้งานโหมด fixed format ของ COBOL จริง ๆ
    COBOL มีอยู่สองโหมดคือ free mode และ fixed format mode
    fixed format เป็นมรดกจากยุคบัตรเจาะรู โดยแบ่งตามคอลัมน์ที่กำหนดไว้

    • คอลัมน์ 1~6: หมายเลขบรรทัด

    • คอลัมน์ 7: ตัวอักษร indicator (เช่น * คือคอมเมนต์ ดูได้ในโค้ดตัวอย่าง)

    • คอลัมน์ 8~11: division marker พิเศษ บางครั้งกินพื้นที่มากกว่านั้น(ไฟล์ตัวอย่าง)

    • คอลัมน์ 12~72: คำสั่ง COBOL จริง

    • คอลัมน์ 73~80: ใช้ได้อย่างอิสระ เช่น หมายเหตุของโปรแกรมเมอร์
      โครงสร้างแบบนี้เป็นภาระกับนักพัฒนาและเครื่องมือในปัจจุบัน จึงแนะนำให้ใช้โหมด free format
      แต่โหมด fixed format ก็มีเสน่ห์เฉพาะตัวอยู่เหมือนกัน ดังนั้นถ้าจะใช้ COBOL ในปี 2025 ก็อยากแนะนำให้ดื่มด่ำบรรยากาศย้อนยุคแบบเต็มที่

    • คอลัมน์ 73~80 บางทีก็ใช้ใส่ลำดับเลข เพื่อให้เอาไปเรียงใหม่ด้วยเครื่องคัดแยกได้เวลาบัตรหล่นกระจัดกระจาย
      ถ้าอยากสัมผัสความเป็นบัตร COBOL ลองเลือก COBOL card ได้ที่ลิงก์นี้
      ถ้าอยากได้อารมณ์เก่ากว่านั้นอีก ก็อาจเขียนโปรแกรมลง coding form ก่อน แล้วให้ผู้ช่วยเอาไป keypunch ต่อก็ได้(ตัวอย่าง)

    • Fortran สมัยก่อนก็ใช้โครงสร้างคอลัมน์ตายตัวเหมือนกัน แต่การจัดวางคอลัมน์ต่างกัน
      จุดร่วมคือมักเว้นคอลัมน์ 73~80 ไว้สำหรับเลขลำดับเพื่อการเรียงบัตร
      ฉันไม่เคยใช้บัตรจริง แต่คิดว่าเพราะบัตรหล่นหรือสลับลำดับได้ง่าย เลขลำดับกับเครื่องเรียงคงมีประโยชน์มาก

    • ฉันก็ประทับใจกับจุดนี้เหมือนกัน
      แต่ก็น่าสนใจที่ใน Makefile กลับใช้ตัวเลือก -free ของ cobc

  • คนชอบพูดว่า “ใช้เครื่องมือที่ดีที่สุดสำหรับงาน” แต่พอเป็น COmmon Business Oriented probLems กลับไม่เลือก COBOL

    • ใช้ได้กับ MUMPS เหมือนกันเลย
      คนมักมองข้ามว่าตัวเองมีสิทธิ์เลือกอะไรที่ยอดเยี่ยมได้

    • ไม่ใช่แค่ไม่เลือก COBOL แต่หลายคนไม่แม้แต่จะพิจารณามันด้วยซ้ำ

    • ฉันสงสัยว่าเรามักใช้คำว่า "เครื่องมือที่ดีที่สุดสำหรับงาน" กันตอนไหนและเพราะอะไร

  • บริษัทของเราเปิดมานานกว่า 40~50 ปีแล้ว
    ตอนนี้การดำเนินธุรกิจ 90% ก็ยังอยู่บน COBOL
    พนักงานหน้างานยังทำงานบน blue screen ที่สร้างด้วย RM/COBOL และ RM/PANELS
    จนถึงช่วงปี 2010 เรายังสร้าง HTML ด้วย COBOL อยู่ แต่ไม่ได้รับ HTTP request โดยตรง
    เราใช้ RPC layer ไว้หลัง Apache แล้วแปลง HTTP request เป็น CGI เพื่อส่งต่อให้ COBOL
    โปรแกรม COBOL จะส่งสตริง HTML ผ่านอินเทอร์เฟซ CGIRPC และผลลัพธ์ก็ออกไปเป็นเว็บเพจในเบราว์เซอร์
    ทุกวันนี้ก็ยังใช้สิ่งนี้กับบริการ XML และงานอื่น ๆ เพื่อเสริมเว็บแอปเดิม
    พูดตรง ๆ ว่าโปรเจ็กต์นี้เจ๋งกว่านั้นไปอีกมาก

  • น่าสนใจที่แทบทุกบรรทัดของโค้ดมีคอมเมนต์กำกับไว้
    มันทำให้ย้อนคิดถึงสมมติฐานของคำพูดที่ว่า “โค้ดควรเป็นเอกสารในตัวเอง”
    คำพูดนี้มีสมมติฐานว่าคนอ่านโค้ดรู้จักภาษานั้นอยู่แล้ว และในบางกรณีโค้ดก็ควร "self-documenting" ได้
    คนที่คุ้นกับ COBOL อาจบอกว่า COBOL ก็ self-documenting ได้ดีพอ แต่ฉันไม่แน่ใจ

    • ดูจาก commit d9a5e3e จะเห็นข้อความว่า "เพิ่มคอมเมนต์เพื่อให้คนที่สงสัยเข้าใจได้ว่าแต่ละบรรทัดทำอะไร"

    • ฉันคิดว่าคำว่า "โค้ดถูกอ่านโดยคนที่รู้ภาษา" นั้นขึ้นอยู่กับบริบท
      ถ้าเป็นโค้ดที่เขียนเพื่อเรียนรู้เองหรือเขียนให้คนอื่นระหว่างการเรียน การใส่คอมเมนต์ว่าแต่ละบรรทัดทำอะไรถือว่าเป็นธรรมชาติ
      แต่ในสภาพแวดล้อมแบบมืออาชีพ การสมมติว่าทีมรู้ภาษาดีพอ แล้วจัดการโครงสร้างให้ดีโดยไม่ต้องพึ่งคอมเมนต์ มักอาจเป็นตัวเลือกที่ดีกว่า

    • ฉันเคยได้ยินคนในธนาคารอ้างว่าโค้ด COBOL นั้นเหมือนภาษาธรรมชาติอยู่แล้ว เลยถือว่าเป็น self-documenting ซึ่งทำเอาแทบหลุดขำ

  • เหมือนจะเป็นมุก แต่ฉันสงสัยจริงเลยอยากถามไว้
    มีใครรู้เรื่องการรับประกันด้านความปลอดภัยของ COBOL ดีไหม
    เช่น COBOL อนุญาตให้เข้าถึงหน่วยความจำเกินขอบเขตหรือไม่ และมีความเสี่ยงเกิดช่องโหว่จาก “ความผิดพลาด” แบบที่เจอใน C หรือ Rust มากน้อยแค่ไหน

    • การเข้าถึงหน่วยความจำเกินขอบเขตใน COBOL ถ้าเป็นคอมไพเลอร์สมัยใหม่ก็มักจะฟ้อง error และถ้ายังคอมไพล์หรือรันได้ ก็จะเจอ runtime error หรือไม่ก็แครชทันที
      อย่างไรก็ตาม COBOL มีฟีเจอร์ reference modification ที่ทำให้สามารถอ้างถึงหน่วยความจำนอกขอบเขตข้อมูลได้โดยตั้งใจ
      มันไม่ถึงกับปลอดภัยสมบูรณ์ แต่ก็มีข้อดีที่ช่วยจับความผิดพลาดหรือการใช้งานผิดจำนวนมากตั้งแต่ขั้นคอมไพล์ ทำให้อัตราความผิดพลาดจากคนลดลงพอสมควร

    • ตอนดู http handler ฉันก็สงสัยเรื่องเดียวกัน
      ถ้าไม่มีช่องว่างระหว่าง method กับ path ก็น่าจะมีโอกาสเกิด buffer overrun ได้
      ฉันยังไม่ได้ลองรันเอง แต่ก็เป็นความกังวลแบบนั้น

  • ฉันอยากรู้เพิ่มว่า CALL "socket" ทำอะไร
    CALL คือการเรียก subprogram แต่ฉันไม่รู้ว่า "socket" ถูกกำหนดไว้ที่ไหน
    เมื่อก่อนฉันก็เคยคิดจะลองทำเว็บเซิร์ฟเวอร์ด้วย COBOL แต่ไปเจอแค่ใน GnuCOBOL FAQ ว่าทำผ่าน CGI ได้(ดู FAQ) แล้วก็ไม่ได้ไปต่อ
    อยากลองดูโปรเจ็กต์นี้ให้ลึกกว่านี้
    มันน่าสนใจมากจริง ๆ

    • "socket" อาจเป็นการเรียก system call ก็ได้
  • เคยมีช่วงหนึ่งที่ COBOL ถูกใช้เป็นแบ็กเอนด์ของเว็บไซต์ในหน่วยงานรัฐและบริษัทบางแห่ง
    เว็บไซต์ยุคนั้นสังเกตได้ง่ายจาก HTML ที่ถูกพิมพ์ออกมาในฟอร์แมตความกว้างคงที่ 100 คอลัมน์แบบมีเอกลักษณ์

  • ฉันเคยคิดว่าภาษาไหนก็เขียนโปรแกรมได้หมด แต่พอเห็นโปรเจ็กต์ COBOL นี้แล้ว Assembly ยังดูสะอาดและสง่างามกว่าเสียอีก
    Jms Dnns! โปรเจ็กต์นี้เป็นงานที่ยอดเยี่ยมและเปิดโลกความคิดจริง ๆ

    • งานแรกของฉันคือซัพพอร์ตระบบการผลิตด้วย COBOL และระบบการเงินด้วย Assembler
      จากประสบการณ์ที่เคยต้องรับมือกับซอร์สโค้ดหนาหลายสิบเซนติเมตรของทั้งสองภาษา COBOL จัดระเบียบในหัวได้ง่ายกว่ามาก
      แต่ก็อาจแล้วแต่คน
  • เป็นโปรเจ็กต์ที่เจ๋งมากจริง ๆ
    ถ้าใครมีทิปสำหรับการเริ่มต้นเรียน COBOL ก็อยากฟัง

  • เท่านี้ก็เข้าใกล้วิสัยทัศน์ของ COBOL on Cogs ไปอีกขั้นแล้ว
    ดูเพิ่มได้ที่ coboloncogs.org