CGIBASHOPTS: CGI BASH OPTIONS การแยกวิเคราะห์
CGIBASHOPTS เป็นไลบรารี Bash Pure ที่มีขนาดเล็กและรวดเร็วในการแยกวิเคราะห์พารามิเตอร์เว็บแบบฟอร์มสำหรับสคริปต์ Bash Shell Web CGI แม้จะมีการอัปโหลดไฟล์ไบนารี ใช้ฟรีโดยไม่มีข้อ จำกัด (ใบอนุญาต MIT) (c) Colas Nahaboo 2017
เร็ว
- คัดลอกไฟล์
cgibashopts ที่ไหนสักแห่งบนเซิร์ฟเวอร์ของคุณ เช่น AS /usr/local/bin/cgibashopts - เพียงจัดหาไฟล์นี้ที่จุดเริ่มต้นของสคริปต์ CGI Bash ของคุณ เช่น:
source /usr/local/bin/cgibashopts . /usr/local/bin/cgibashopts - ค่าของพารามิเตอร์ฟอร์มเว็บฟอร์ม
foo (เช่นในหน้า html: <input type=text name=foo> ) สามารถพบได้เป็นค่าของตัวแปรสภาพแวดล้อมเชลล์ $FORM_foo
การแก้ไขปัญหา:
- หากมีบางอย่างผิดปกติให้เรียกใช้
tests/tewiba -v ในไดเรกทอรี cgibashopts บนเซิร์ฟเวอร์ของคุณเพื่อดูว่าชุดทดสอบตรวจจับปัญหาหรือไม่ - CGIBASHOPTS ต้องการ
bash GNU รุ่น grep , sed ในการทดสอบสิ่งนี้เรียกใช้ grep -P . /dev/null คุณไม่ควรได้รับข้อผิดพลาด หากคุณทำเช่นนั้นคุณควรติดตั้งในระบบที่มีลักษณะเหมือน UNIX ที่ไม่ได้ใช้ยูทิลิตี้ GNU โดยค่าเริ่มต้นเช่น MacOS , BusyBox, FreeBSD, BSD และ SYSV อนุพันธ์ ...- บน macOS ดูปัญหา #10
- บน BusyBox คุณต้องติดตั้งแพ็คเกจสำหรับ
bash , coreutils , grep , sed เวอร์ชัน GNU - บน FreeBSD ใช้ Freshports
คุณสมบัติ
- ใช้งานง่าย: เพียงไฟล์เดียว
- เร็วและเล็ก
- Pure Bash ยกเว้นการใช้ grep, sed และ truncate
- จัดการรับและโพสต์คำขอด้วยวิธีการทั้งหมดของการเข้ารหัสพารามิเตอร์: แอปพลิเคชัน/X-WWW-FORM-URLENCODED, Multipart/Form-Data, Text/Plain
- จัดการสตริงค้นหาดัชนีดัชนีมรดก
- จัดการการอัปโหลดไฟล์ไบนารีและไฟล์ข้อความด้วย Unix หรือ DOS NewLines ฉันไม่พบห้องสมุดที่มีอยู่ใด ๆ ที่ให้ฟังก์ชันนี้สำหรับการเขียนโปรแกรม CGI Shell
- ใช้คุณสมบัติ "คลาสสิก" ของทุบตีเท่านั้นและควรทำงานร่วมกับเวอร์ชันเก่าทุบตีฉันเดาว่า 4.1+
เอกสาร
- เมื่อใช้งานไลบรารี CGIBASHOPTS จะถอดรหัสพารามิเตอร์ที่ส่งโดยเบราว์เซอร์ที่เว็บเซิร์ฟเวอร์ให้กับสคริปต์เป็นตัวแปรสภาพแวดล้อมที่หลากหลายและเป็นทางเลือกอินพุตมาตรฐานตามมาตรฐาน CGI CGIBASHOPTS ทำให้พวกเขาพร้อมใช้งานสคริปต์รวมอยู่ในรูปแบบที่ใช้งานง่าย: ตัวแปรฟังก์ชั่นและไฟล์
- ในการใช้ไลบรารีให้มาที่จุดเริ่มต้นของสคริปต์โดยเร็วที่สุดเพื่อหลีกเลี่ยงความขัดแย้งกับตัวแปรที่คุณสามารถใช้ในภายหลังในสคริปต์ของคุณ
- ห้องสมุดถอดรหัสพารามิเตอร์ของคำขอ Get และ Post ด้วยวิธีที่เป็นไปได้ทั้งหมดในการเข้ารหัสพารามิเตอร์ (ผ่าน "Enctype")
- รายการชื่อพารามิเตอร์แสดงอยู่ใน
$FORMS เป็นสตริงชื่อที่คั่นด้วยอวกาศ เช่น: echo "$FORMS" ==> foo bar gee ชื่อพารามิเตอร์เป็นหนึ่งที่ระบุโดยแอตทริบิวต์ name ในองค์ประกอบ HTML ต่างๆในรูปแบบ HTML หรือส่งผ่านคำสั่งเช่น wget หรือ curl ชื่อพารามิเตอร์จะต้องเป็นชื่อตัวแปรทางกฎหมายสำหรับ BASH: อักขระตัวอักษรและตัวเลขและขีดเส้นใต้และไม่เริ่มต้นด้วยตัวเลข - ชื่อพารามิเตอร์ที่ไม่ถูกต้อง (เช่น: 0to60, ab, a: b, ... ) ถูกละเว้นอย่างเงียบ ๆ เช่นเดียวกับค่าของพวกเขา
- ค่าพารามิเตอร์แต่ละค่าจะถูกคัดลอกเป็นค่าของตัวแปรสภาพแวดล้อมที่มีคำนำหน้า เช่น:
$FORM_foo สำหรับองค์ประกอบรูปแบบ HTML ชื่อ foo - ค่าพารามิเตอร์แบบหลายบรรทัดจะถูกแปลงเป็น unix end ของบรรทัด (ใหม่ไลน์แทนการส่งคืนรถและใหม่)
- การอัปโหลดไฟล์: เมื่ออัปโหลดไฟล์ผ่านองค์ประกอบแบบฟอร์มเช่น
<input type=file name=file1> , cgibashopts วางชื่อพารามิเตอร์ (ที่นี่ file1 ) ลงในตัวแปร $ formfiles ซึ่งเป็นรายการที่คั่นด้วยอวกาศของชื่อพารามิเตอร์ไฟล์ทั้งหมดที่ได้รับ ชื่อจริงของไฟล์ที่อัปโหลดสามารถพบได้ในค่าตัวแปร (ที่นี่ $FORM_file1 ) ในขณะที่เนื้อหาของไฟล์สามารถพบได้ในไฟล์ท้องถิ่นที่มีชื่อโดยตัวแปรในไดเรกทอรี $CGIBASHOPTS_DIR (ที่นี่ $CGIBASHOPTS_DIR/file1 ))- เฉพาะไฟล์ที่อัปโหลดจริงเท่านั้นที่ถูกสร้างและแสดงรายการด้วยวิธีนี้ หากผู้ใช้ไม่ได้เลือกไฟล์ใด ๆ ในแบบฟอร์มตัวแปรเชลล์จะไม่ถูกกำหนดหรือสร้างไฟล์ใด ๆ
- อย่างไรก็ตามไฟล์ที่อัพโหลดว่างจะถูกสร้างขึ้น แน่นอนว่าพวกเขาจะว่างเปล่า
- ไฟล์ไบนารีและข้อความที่ได้รับจะ ไม่ ถูกแปลงในรูปแบบข้อความ UNIX (บรรทัดจบด้วยบรรทัดใหม่) แม้ว่าไคลเอ็นต์จะอัปโหลดในรูปแบบ DOS (บรรทัดจบลงด้วยการคืนรถและสายใหม่) ดังนั้นคุณต้องพร้อมที่จะจัดการบรรทัด DOS ในไฟล์ข้อความที่อัปโหลด
- คำเตือน: ต้อง เรียกใช้ฟังก์ชั่นการล้างข้อมูล bash
cgibashopts_clean ในตอนท้ายของสคริปต์ของคุณเพื่อลบไดเรกทอรีชั่วคราว $CGIBASHOPTS_DIR จัดเก็บไฟล์ที่อัปโหลดหากตัวเลือก -n (ดูด้านล่าง) ไม่ได้ใช้ CGIBASHOPTS ทำกับ trap cgibashopts_clean 0 เพื่อให้ฟังก์ชั่นนี้จะถูกเรียกโดยอัตโนมัติในตอนท้ายของสคริปต์ของคุณดังนั้นคุณไม่ต้องทำอะไรเลยเว้นแต่คุณจะใช้กับ trap 0 ตัว cgibashopts_clean เอง- การจัดหา cgibashopts จะลบกับ
trap 0 ที่ทำก่อนหน้านี้ ดังนั้นตั้งค่ากับดักของคุณ 0 หลังจากจัดหา cgibashopts - การเรียก cgibashopts_clean เป็นสิ่งจำเป็นเฉพาะในกรณีที่ฟอร์ม HTML ของคุณใช้องค์ประกอบอินพุตของ
file ประเภท - ทันทีที่คุณดำเนินการไฟล์ที่อัปโหลดคุณสามารถเรียกใช้ฟังก์ชั่น
cgibashopts_clean ด้วยตัวเองอย่างชัดเจนเพื่อที่จะไม่จำเป็นต้องใช้อีกต่อไปและคุณมีอิสระที่จะใช้กับดักตามที่คุณต้องการในภายหลัง - หากคุณไม่คาดหวังว่าจะอัปโหลดไฟล์คุณสามารถใช้ตัวเลือก -N (ดูด้านล่าง)
- ตัวเลือกบรรทัดคำสั่ง:
- -n สามารถให้เพื่อละเว้นและยกเลิกคำขอใด ๆ ในการอัปโหลดไฟล์ แนะนำนี้หากคุณไม่คาดหวังว่าไฟล์จะถูกอัปโหลดเนื่องจากสามารถบันทึกโหลดการคำนวณบางอย่างหากผู้โจมตีบางคนพยายามอัปโหลดไฟล์ปลอม แต่ไม่จำเป็น นอกจากนี้ยังไม่ได้กำหนดตัวแปร
$CGIBASHOPTS_DIR หรือฟังก์ชั่น cgibashopts_clean และไม่ใช้กับดัก หมายเหตุ: มีเฉพาะในเวอร์ชัน 3 ขึ้นไปเท่านั้น ตัวอย่างการใช้งาน: . cgibashopts -n - -d Directory ระบุตำแหน่งที่ CGIBASHOPTIONS จะจัดการไฟล์ชั่วคราวในกรณีที่มีการอัปโหลดไฟล์ มันเริ่มต้นเป็น
/tmp CGIBASHOPTIONS จะสร้างขึ้นใน cgibashopts-files.$$ SUBDIRECTORY (โดยที่ $$ คือหมายเลขกระบวนการ BASH, ไม่ซ้ำกันต่ออินสแตนซ์) แสดงในตัวแปร $CGIBASHOPTS_DIR
- ตัวแปร
CGIBASHOPTS_RELEASE ถือรุ่นรีลีสใช้เวอร์ชันความหมาย (เช่น 4.0.1, 4.4.3) ของห้องสมุด CGIBASHOPTS ที่ใช้ในเวอร์ชันที่มีการระบุไว้ในตอนท้ายของหน้านี้ใน ประวัติศาสตร์ของการเปลี่ยนแปลง ...- ตัวแปร
CGIBASHOPTS_VERSION มีหมายเลขเวอร์ชันหลัก (จำนวนเต็มแรกของ CGIBASHOPTS_RELEASE ด้านบนสำหรับความเข้ากันได้ย้อนหลัง
- สินค้าผิด:
- มีฟังก์ชั่นทุบตีสองอย่างที่มีประโยชน์:
-
urldecode ที่ใช้สตริงในพารามิเตอร์และส่งออกเวอร์ชันที่ถอดรหัสแปลง + ในช่องว่างและ %XX ในลักษณะของ hexadecimal ascii code xx (เช่น %41 กลายเป็น a) และลบการส่งคืนรถ -
urlencode ที่ดำเนินการย้อนกลับ ทั้งสองเร็วกว่าคำสั่งไบนารี Linux
- ตัวแปรสองตัว
$nl และ $cr ถือบรรทัดใหม่และอักขระส่งคืนรถ - วิธีอื่นในการรับค่าตัวแปรคือผ่านฟังก์ชั่น
param นี่เป็นเพียงฟังก์ชั่นความสะดวกสบายที่เข้ากันได้กับ Bashlib สำหรับผู้คน (หรือสคริปต์) ที่ใช้กับมัน-
param ที่ไม่มีอาร์กิวเมนต์ส่งออกค่าของ FORMS -
param foo ส่งออกค่าของ FORM_foo -
param foo a string... ตั้งค่าของ FORM_foo เป็น "a string..." -
param -f พิมพ์ $FORMFILES -
param -f foo พิมพ์ $FORMFILE_foo -
param -f foo a string... ตั้งค่าของ FORMFILE_foo เป็น "a string..."
ชุดทดสอบ
มีการให้ชุดทดสอบสามารถเรียกใช้งานได้โดย ./tests/RUN-ALL-TESTS run-all-tests สำหรับรายละเอียดเพิ่มเติมดู readme.md ใน tests ไดเรกทอรี
โครงการที่ใช้มัน
- Watermark-PDF หน้าเว็บสำหรับสคริปต์ลายน้ำ PDF โดย Pipoprods
- ค้นหาในทุกโครงการ GitHub ทั้งหมดที่อ้างอิง
ข้อเสนอแนะ
รู้สึกยินดีที่จะคัดลอกและปรับปรุงโครงการนี้รวมถึงการจัดทำรายงานข้อผิดพลาดข้อเสนอแนะคำแนะนำผ่าน:
- การสร้างปัญหาหากคุณมีบัญชี GitHub
- ใช้แบบฟอร์มรายงาน GIT ที่ให้ไว้เพื่อสร้างปัญหาหากคุณไม่มีบัญชี Githib
- สร้างหรือมีส่วนร่วมในการอภิปรายในโครงการนี้
- หรือเพียงแค่ส่งอีเมลถึงฉัน: [email protected]
ประวัติความเป็นมาของการเปลี่ยนแปลง
- 2023-01-11 v4.1.3: แก้ไขสำหรับชุดทดสอบเท่านั้นเพื่อหลีกเลี่ยงข้อบกพร่องในเวอร์ชันทุบตี <4.4 รหัสจริง CGIBASHOPTS ไม่เปลี่ยนแปลงไม่จำเป็นต้องอัพเกรดเว้นแต่จะผ่านชุดทดสอบในระบบมรดก
- 2023-01-08 v4.1.2: การแก้ไขข้อผิดพลาด: มีเพียงเครื่องหมายอัฒภาคเท่านั้นที่เข้าใจว่าเป็นตัวคั่นใน
Content-Type และ Content-Disposition HTTP แก้ไขเพื่อใช้เครื่องหมายจุลภาค บั๊กรายงานโดย "Florin-CTU", ปัญหา #8 และ #9 - 2022-11-24 v4.1.1: การแก้ไขข้อผิดพลาด: ฟิลด์ฟอร์มหลังจากฟิลด์อัพโหลดไฟล์ถูกละเว้น กรุณาอัพเกรด! รายงานข้อผิดพลาดโดย "Pipoprods", ฉบับที่ 7
- 2021-12-23 v4.1.0:
- เปลี่ยนเป็นเวอร์ชันความหมายด้วย var
CGIBASHOPTS_RELEASE ใหม่ - ตัวเลือกใหม่ -D เพื่อระบุไดเรกทอรีชั่วคราว (ข้อเสนอแนะของ "aufschlauer"))
- ย้ายไปที่ GitHub: ย้ายไฟล์ส่วนใหญ่ออกจากมุมมองหลักในการทดสอบ/, Tewiba ที่อัพเกรดเป็น 1.5.0, การทำความสะอาดรหัสขึ้นเพื่อส่ง Shellcheck
- 2020-04-16 เวอร์ชัน 4: เพิ่มฟังก์ชั่น goodie urlencode
- 2020-04-04 การเปลี่ยนแปลงเครื่องสำอางบางอย่างในเอกสารนี้และการทดสอบ (การทดสอบ-ห้องเปิดเปลี่ยนชื่อเป็นการทดสอบ) แต่ไม่มีการเปลี่ยนแปลงรหัส CGIBASHOPTS เองดังนั้นจึงไม่มีหมายเลขเวอร์ชันเพิ่มขึ้น
- 2020-03-27 เวอร์ชัน 3: -N เพิ่มตัวเลือกในการปิดการอัปโหลดไฟล์
- 2018-10-09 เวอร์ชัน 2: แก้ไขช่องว่างในค่าพารามิเตอร์สามารถมองเห็นได้เป็น +
- 2017-12-13 เวอร์ชัน 1: แก้ไขสำหรับการอัปโหลดไฟล์ด้วยประเภท MIME ต่างๆ
- การสร้างโครงการ 2017-12-07