Tải bản đầy đủ (.doc) (69 trang)

Lập trình CGI bằng Perl trên Linux

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (900.28 KB, 69 trang )

Lập trình CGI bằng Perl trên Linux 1
Lời cảm ơn
Lời đầu tiên, tôi xin bày tỏ lòng biết ơn các thầy, các cô Khoa công
nghệ thông tin cùng toàn thể các thầy giáo, cô giáo trờng Đại học kỹ
thuật, những ngời đã trao cho tôi nhiều kiến thức quý báu để tôi có đợc
ngày hôm nay.
Xin trân thành cảm ơn thầy Đặng Bá L, thầy Nguyễn Tấn Khôi
những ngời đã trực tiếp hớng dẫn tôi trong suốt thời gian làm đồ án.
Đặc biệt xin chân thành cảm ơn các thầy Võ Ngọc Anh, thầy Nguyễn
Tấn Khôi, những ngời đã cho tôi những ý tởng mang tính chiến lợc để
tôi có thể hoàn thành đồ án này.
Xin đợc gửi lời cảm ơn bạn bè, những ngời đã giúp đỡ, động viên
tôi về tinh thần cũng nh vật chất trong xuốt thời gian qua.
Cuối cùng, tôi xin bày tỏ lòng biết ơn gia đình, cha mẹ, anh chị,
những ngời đã nuôi nấng, dạy dỗ tôi để tôi có đợc nh ngày hôm nay.
Đà Nẵng Ngày 20 Tháng 6 năm 2000
Sinh viên thực hiện
Nguyễn Hoàng Việt
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 2
Tóm tắt nội dung đồ án
Đồ án này đợc chia làm 6 chơng:
- Chơng I: Tổng quan về đề tài, giới thiệu các vấn đề sẽ đa ra nghiên cứu trong đề tài.
Giới thiệu hệ điều hành Linux, công nghệ CGI ứng dung trên Linux, và ngôn ngữ Perl
cùng với bài toán sẽ đa ra giải quyết.
- Chơng II: Công nghệ CGI: gồm khái niệm, các thành phần của CGI và cách thức lập
trình với CGI trong môi trờng Linux. Trong chơng này có đa ra một số ví dụ về các CGI
scrips đợc viết bằng ngôn ngữ Perl và C để làm nổi bật tính không phụ thuộc ngôn ngữ
lập trình của CGI
- Chơng III: Nghiên cứu lập trình với ngôn ngữ Perl. Khái niệm về biến, mảng . . .
trong Perl đợc đa ra xem xét ở đây. Đặc biệt là mảng liên hợp (assosiative array - hash )


và một số hàm chuển của Perl trong thao tác với mảng liên hợp. . .
- Chơng IV: Phân tích bài toán quản lý sinh viên tại trờng Đậi học kỹ thuật Đà nẵng.
Khảo sát các thành phần của hệ thống, các nguyên tắc quản lý, các đối tợng khai thác hệ
thống. Mô hình hoá và giải quyết bài toán bằng ngôn ngữ Perl theo công nghệ CGI trên
môi trờng Linux.
- Chơng V: Kết quả thực hiện chơng trình.
- Chơng VI: Kết luận, nêu những kết quả đạt đợc về lý thuyết, thực tiễn, những hạn
chế, tính khả thi và hớng phát triển của đề tài .
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 3
mục lục
mục lục.................................................................................................3
Tổng quan về đề tài......................................................................5
.I Tình hình sử dụng Linux..........................................................................5
.II CGI và Linux...........................................................................................5
.III Ngôn ngữ Perl.......................................................................................6
.IV Mục tiêu đồ án......................................................................................6
Công nghệ CGI..................................................................................7
I. Tổng quan về CGI....................................................................................7
I.1. CGI là gì ?..................................................................................................9
I.1.1 Khái niệm Gateway.........................................................................................9
I.1.2 Common Gateway Interface.........................................................................10
I.2 Tại sao dùng CGI ?...................................................................................11
II Lập trình với CGI......................................................................................12
II.1 Lựa chọn ngôn ngữ..........................................................................................12
II.1.1 C/C++(Unix, Linux, Windows, Macintosh)............................................12
II.1.2 Perl (Unix, Linux, Windows, Macintosh)...............................................12
II.1.3 Visual Basic (chỉ dùng trên môi trờng Windows)...................................13
II.2 Những vấn đề cơ bản trong lập trình CGI....................................................13
II.2.1 Chơng trình ví dụ.....................................................................................13

II.2.2 Outputting CGI........................................................................................15
II.2.2 Sơ lợc về HTML Forms...........................................................................17
II.2.2.1 Thẻ FORM ......................................................................................18
II.2.2.2 Trờng text và Password.....................................................................18
II.2.2.3 Nút Reset và Submit........................................................................19
II.2.2.4 Tham chiếu một số tags...................................................................19
II.2.3 Input CGI.................................................................................................19
Tóm lại............................................................................................................26
III. Cài đặt và chạy chơng trình CGI.......................................................27
III.1 Cấu hình Server để chạy CGI................................................................28
III.2 Cài đặt CGI trên server UNIX..............................................................28
III.3 Chạy chơng trình CGI..........................................................................29
Ngôn ngữ Perl................................................................................30
.I Giới thiệu..................................................................................................30
.II Biến trong Perl.......................................................................................31
II.1 Biến vô hớng(Scalar variables)...............................................................32
II.2 Khối lệnh và các cấu trúc điều khiển......................................................32
II.3 Phạm vi của biến......................................................................................34
II.4 Luật trích dẫn...........................................................................................35
.III Mảng và mảng liên hợp......................................................................37
III.1 Mảng.......................................................................................................37
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 4
III.2 Mảng liên hợp ( associative array - hashes ).........................................40
Phân tích và thiết kế hệ thống.........................................42
.I Đặt vấn đề................................................................................................42
I.1 Dẫn nhập...................................................................................................42
I.2 Yêu cầu......................................................................................................42
I.3 Các đối tợng khai thác hệ thống...............................................................42
I.3.1 Phòng đào tạo và công tác chính trị.............................................................42

I.3.2 Các vị giáo vụ khoa........................................................................................43
I.3.3 Sinh viên, gia đình sinh viên ( ngời dùng trên mạng).................................43
I.3.4 Những thuận lợi và khó khăn.......................................................................43
)a Thuận lợi........................................................................................................43
)b Khó khăn.......................................................................................................43
.II Phân tích hệ thống.................................................................................43
II.1 Khảo sát hệ thống....................................................................................43
II.2 Sơ đồ dòng dữ liệu...................................................................................45
II.3 Từ điển dữ liệu........................................................................................48
II.4 Mô hình thực thể kết hợp.........................................................................49
II.5 Mô hình nhị nguyên................................................................................50
.III Xây dựng chơng trình.........................................................................51
III.1 Chọn công cụ..........................................................................................51
III.2 Xây dựng mô hình Logic dữ liệu............................................................52
III.3 Các thủ tục xử lý trong chơng trình......................................................53
1. Module nhập danh sách lớp mới ( nhapds.cgi )...............................................53
2. Module tìm kiếm sinh viên ( timkiem.cgi )......................................................53
3. Module xem danh sách ( xem_danh_sach1.cgi ).............................................53
4. Module xem điểm ( xem_diem.cgi )..................................................................53
kết quả thực hiện chơng trình.........................................54
.I Xây dựng môi trờng hệ thống.................................................................54
.II Chạy chơng trình...................................................................................55
Kết luận.............................................................................................58
.I Những kết quả đạt đợc............................................................................58
I.1 Lý thuyết....................................................................................................58
I.2 Thực tiễn....................................................................................................59
.II Tính khả thi............................................................................................59
.III Hạn chế...............................................................................................59
.IV Hớng phát triển...................................................................................59
Tài liệu tham khảo.....................................................................60

Phụ lục................................................................................................61
.I Module nhapds.cgi..................................................................................61
.II Module xemdanhsach.cgi......................................................................63
.III Module xemdiem.cgi...........................................................................65
.IV Module timkiem.cgi............................................................................67
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 5
Chơng I
Tổng quan về đề tài
.I Tình hình sử dụng Linux
Linux đợc xem là một hiện tợng trong lĩnh vực hệ điều hành vài năm gần đây. Báo
chí, các diễn đàn, các phòng nói chuyên trực tuyến trên mạng, chơng trình "Tìm kiếm t-
ơng lai" của VTV3 Đài truyền hình Việt nam . . .Thậm chí cả chơng trình "Khoa học vui"
cho trẻ em của VTV1 cũng đều đã có bài đăng tải về Linux.
Vậy thì Linux là gì vậy ? Linux là một hệ điều hành giống nh bao hệ điều hành khác.
Nhng nó có nhiều tính năng mạnh mà không có ở một số hệ khác. Chúng ta, chắc ai cũng
đã biết về một hệ điều hành tiền bối - UNIX. Khác với các hệ điều hành của Microsoft,
UNIX không rễ sử dụng với những ngời mới làm quen, không đợc thân thiện cho lắm, nh-
ng bù vào đó Unix là một hệ điều hành đa nhiệm thực sự, đợc viết ra để hỗ trợ cho nhiều
ngời sử dụng, nó tận dụng đợc tối đa nguồn lực khần cứng của máy tính chính vì vậy
Unix có thể chạy tốt trên một số máy tính với cấu hình rất hạn chế. Khả năng kết nối và
điều hành mạng rất tốt, có thể đóng vai trò phục vụ trong hầu hết các ứng dụng Internet
hiện nay. Unix là một môi trờng lập trình lý tởng cho các nhà lập trình viên chuyên
nghiệp.
Linux mang dòng máu của Unix, đợc phát triển bởi Sun MicroSystem. Linux có đầy
đủ các tính năng vốn có của Unix và Linux đã thân thiện và dễ sử dụng hơn thông qua hệ
thống X-Window. ở các nớc Châu Âu, đặc biệt là Pháp, Linux đợc đặc biệt yêu mến và sử
dụng rộng rãi. Điều này cũng dễ giải thích do những tính năng tiến bộ của Linux: tính
bảo mật cao, hệ thống kết nối mở, tích hợp nhiều công nghệ mới, nhiều ngôn ngữ lập
trình đợc bao hàm trong hệ thống . . .

ở nớc ta, Linux đợc biết đến trong vòng khoảng 3 năm trở lại đây. Chúng ta đã biết,
máy tính đợc sử dụng thực sự rộng rãi ở nớc ta trong khoảng 10 năm nay, thời điểm mà
các hệ điều hành của Microsoft đang thống trị - DOS, Windows 3.x. Theo truyền thống
thì việc thay đổi một hệ điều hành là chuyện tơng đối khó ở nớc ta, phải đào tạo lại lớp
ngời sử dụng, phải thay đổi hệ thống phần mềm . . .Hơn nữa Linux không phải dễ sử
dụng cũng nh quảnt rị hệ thống. Chính vì vậy, hiện nay ở nớc ta Linux chỉ đợc sử dụng ở
trong các môi trờng xí nghiệp mang tính chuyên môn cao, còn với ngời dùng máy tính PC
thì Linux mới chỉ mang tính khái niệm, "có biết nhng cha dùng".
.II CGI và Linux
Sự phát triển của Internet đã giúp chúng ta gần nhau hơn trong mọi lĩnh vực, bất kể
khoảng cách và ngày đêm. Nhng những Web server trên Internet đa số chỉ phục vụ các
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 6
dịch vụ mang tính truyền thông ở mức vĩ mô. Các ứng dụng để khai thác cơ sở dữ liệu để
phục vụ trong các bài toán quản lý, quảng cáo, diễn đàn, nói chuyện trực tuyến trên
mạng, các dịch vụ tìm kiếm nhanh . . . đều đòi hỏi ngời dùng phải viết chơng trình.
CGI (Common Gateway Interface) là một công nghệ giúp mở rộng khả năng của Web
server để giải quyết các bài toán mang tính đặc thù và có thể vận hành trên mạng. Việc
chọn ngôn ngữ cho lập trình CGI ít bị hạn chế do tính mềm dẻo của nó và chỉ cần tuân
thủ vài nguyên tắc, chúng ta có thể viết một chơng trình CGI.
Chúng ta có thể sử dụng công nghệ CGI để áp dụng cho lập trình trong mọi hệ điều
hành, miễn là hệ điều hành đó có thể kết nối mạng và có một phần mềm Web server chạy
trên đó. Linux là một hệ điều hành mạng, có thể đóng vai trò phục vụ trong nhiều dịch vụ
đang có hiện nay (WWW, FTP, Telnet, Wais. . .). Hơn nữa, Linux cung cấp một Web
server nổi tiếng mang tên Apache Server, phiên bản mới nhất 1.1.5. Web server này hỗ
trợ lập trình CGI rất mạnh.
.III Ngôn ngữ Perl
Perl (Practical Extraction and Reporting Language) có nhiều u điểm của một ngôn
ngữ lập trình có cấu trúc giống nh C , Pascal . . . Song trên thực tế Perl là một ngôn ngữ
diễn dịch (Interpreted language) có nhiều u điểm trong lập trình CGI. Thao tác xử lý

chuỗi mạnh, có khả năng làm việc tốt với các biến môi trờng, dễ lập trình, dễ gỡ rối . . .
Hơn nữa Perl đợc tích hợp bên trong Linux.
.IV Mục tiêu đồ án
Cùng với sự gợi ý của giáo viên hớng dẫn và nhận thức của bản thân về khả năng và
tầm quan trọng của các lĩnh vực đã trình bày ở trên, tôi quyết định chọn hớng nghiên cứu
cho đồ án tốt nghiệp nh sau:
- Hiện thực và cài đặt hệ điều hành Linux
- Nghiên cứu công nghệ CGI
- Lập trình CGI với ngôn ngữ Perl
Cuối cùng để minh họa cho kết quả nghiên cứu, tôi chọn và giải quyết bài toán:
"Quản lý điểm sinh viên trờng Đại học kỹ thuật Đà Nẵng" với ý tởng nh sau:
- Giúp phòng đào tạo quản lý điểm sinh viên của trờng Đại học kỹ thuật
- Giúp cha mẹ sinh viên có thể biết đợc những thông tin về con mình kỳ nào, học
môn gì, mấy điểm thông qua mạng Internet. Góp phần gắn kết mối liên lạc giữa gia đình
và nhà trờng.
- Đơn giản hoá việc liên lạc giữa các giáo vụ khoa và phòng đào tạo trong việc
nộp điểm và cập nhật điểm cho sinh viên qua mỗi học kỳ.
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 7
Chơng II
Công nghệ CGI
(Common Gateway Interface)
I. Tổng quan về CGI
Hiện nay, hầu hết mọi ngời trên thế giới đều có thể gởi và nhận các thông tin trên
mạng Internet. Nhờ có World Wide Web, những thông tin này đợc phân bố rộng rãi và dễ
dàng tìm kiếm. Chắc hẳn trong chúng ta ai cũng đã biết về Web và bạn cũng nh tôi có thể
đã hơn một lần truy cập vào các site của ngời khác nên giờ đây chúng ta có thể nhận ra
rằng những từ viết tắt thoạt nhìn có vẻ đáng ngại nh HTTP, HTML . . . đơn giản chỉ
là những mẫu tự viết tắt của Web hoặc là một phơng thức truyền thông nào đó trên Web.
Web đã đợc thừa nhận là phơng tiện thông tin lý tởng qua sự phổ biến rộng rãi trên

toàn cầu và sự không ngừng lớn mạnh của nó. Mặc dù đã có một số ý kiến thắc mắc về
những tiện ích và những thuộc tính của Web và cũng có một số ý kiến cho rằng việc Web
lớn mạnh và trở nên phổ biến nh vậy chủ yếu nhờ vào sự phát triển của các phơng tiện
"siêu truyền thông" (media hyper), nhng không thể nghi ngờ gì nữa-Web rõ ràng là một
phơng tiện quan trọng trong việc truyền thông tin các loại. Không chỉ các loại dịch vụ
thông tin tức thời ( nh tin tức, tin thời tiết, thể thao. . . ) các tài liệu tham khảo có sẵn
đợc điện tử hoá mà cả một khối lợng khổng lồ các loại dữ liệu khác cũng tồn tại trong
Web. Web thực sự đã trở thành một công cụ hữu dụng về thông tin đại chúng cho hàng
vạn thậm chí hàng triệu ngời trên khắp thế giới.
Tại sao Web lại trở nên duy nhất và đáng giá nh vậy ? Trớc hết, Web là một giao diện
siêu truyền thông cho các loại dữ liệu. Hãy xét việc lu trữ thông tin trên một ổ đĩa cứng
trong một máy tính PC. Rõ ràng là dữ liệu đợc lu trữ và truyền đạt một cách tuyến tính
giống nh một hệ thống hồ sơ vậy. Ví dụ nh chúng ta có một hệ thống các th mục, trong
mỗi th mục chứa các tài liệu hoặc các th mục con (Xem hình 1.1). Web sử dụng một dạng
khác biệt để truyền thông tin - đợc gọi là siêu truyền thông. Một giao diện siêu văn bản
bao gồm một tài liệu và các links. Links là các từ mà chúng ta có thể kích chuột vào để
xem các thông tin khác (Xem hình 1.2). Web mở rộng khái niệm siêu văn bản. Nó bao
gồm các loại thông tin khác nữa nh các bảng biểu, âm thanh, hình ảnh, video . . .
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 8
Hầu hết mọi ngời đều cảm thấy tiện lợi khi sử dụng kiểu truyền và phân bổ thông tin
dễ dàng và duy nhất này. Từ các vị giáo s ở các trờng đại học muốn truyền dữ liệu đến
các đồng nghiệp cho đến các thơng gia những ngời muốn cung cấp thông tin về công
ty của mình cho những ai muốn biết. Tuy nhiên, trong nhiều năm qua mọi ngời đã nhận
ra rằng việc nhận thông tin cũng quan trọng không kém việc truyền thông tin
Mặc dù Web cung cấp cho chúng ta một giao diện siêu truyền thông duy nhất, nhng
ngoài Web ra còn có nhiều phơng thức khác mà hiệu quả cũng không kém. Đó là các
dịch vụ mạng nh File Transfer Protocol (FTP) và Gopher xuất hiện khá lâu trớc Web.
Th điện tử là phơng tiện truyền thông đầu tiên trong việc liên lạc và trao đổi thông tin trên
mạng Internet và hầu hết các mạng khác từ khi chúng xuất hiện. Tại sao Web trở nên phổ

biến nh vậy ? Rõ ràng là tính năng siêu truyền thông của Web đã tạo nên sự thành công
lớn lao ấy, nhng để làm cho Web trở nên có hiệu quả ta phải chú ý đến tính năng tơng tác
của nó.
Nếu không có khả năng nhận thông tin đầu vào từ ngời sử dụng cũng nh khả năng
cung cấp thông tin thì Web chỉ là một phơng tiện truyền thông hoàn toàn tĩnh. Ngời sử
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Hình 1.1
Hình 1.1
Hình 1.2
Lập trình CGI bằng Perl trên Linux 9
dụng có thể tự do truy cập dữ liệu mà không phải phụ thuộc vào cấu trúc " cứng nhắc" đã
đợc định sẵn.
Cụm từ Web server có thể gấy nhầm lẫn vì nó hoặc đề cập đến một máy phục vụ Web
hoặc đề cập đến phần mềm đang chạy trong máy đó - để nối kết nó với các Web browses.
Khi Web browse yêu cầu truy cập một địa chỉ Web đã cho sẵn, việc đầu tiên là Web
browse liên lạc với máy tính mang địa chỉ kia trên Internet, rồi gửi yêu cầu đến phần
mềm chạy trong máy chủ. Phần mền này sẽ chạy tức thì và tơng ứng với mỗi yêu cầu nó
sẽ gởi những trả lời thích hợp.
Mặc dù các Web Server có thể truyền và nhận dữ liệu nhng chức năng của nó cũng
hạn chế. Server thờng không hiểu các thông tin đầu vào bổ sung và nó thờng bỏ qua các
thông tin này, trừ khi các nhà thiết kế ra nó đã cài đặt sẵn chơng trình để xử lý đối với các
thông tin này. Để Server có thể giải quyết đợc nhiều thông tin cao cấp hơn là việc chỉ đơn
thuần nhận và gửi các file đến các browse, chúng ta phải biết cách mở rộng chức năng
của Web Server. Ví dụ, Web server không thể tìm ra cơ sở dữ liệu trên cơ sở một từ khoá
mà ngời sử dụng nhập vào, nó chỉ có thể có đợc khả năng đó khi chúng ta lập trình cho
nó.
I.1. CGI là gì ?
I.1.1 Khái niệm Gateway
Các Web browser có thể truy cập trực tiếp đợc rất nhiều kiểu thông tin và dịc vụ
thông tin nhng không có nghĩa là tất cả. Chẳng hạn nh Archie và Finger là hai dịch vụ

không đợc hỗ trự trên môi trờng Web, hơn thế nữa không phải tất cả các nguồn thông tin
đều tích hợp với Web, ví dụ nh các tài liệu động hoặc các cơ sở dữ liệu. Để giải quyết nh-
ợc điểm này, hầu hết các Web server đều cung cấp phơng thức để tạo ra các trang Web
động theo yêu cầu của ngời sử dụng thông qua các cổng giao tiếp (gateway).
Các gateway giải quyết các vấn đề này bằng cách cung cấp một cơ cấu mở cho Web
server. Một gateway có thể truy nhập đợc các nguồn thông tin không theo dạng chuẩn
của Web (HTML), hoặc là các thông tin nằm bên ngoài Web server. Trên thực tế một
gateway đơn giản chỉ là một kịch bản (Script) đợc ngời lập trình tạo ra, thực chất là một
chơng trình đợc gọi thực hiện bởi Web server khi cần thiết. Thông thờng chúng đợc lu trữ
tại một th mục đặc biệt và vị trí của th mục này đợc Web server biết đến và quản lý. Các
gateway này phải có thuộc tính khả thi, và tuỳ theo từng hệ điều hành mà thuộc tính này
có thể khác nhau. Chẳng hạn, dới Windows thì chúng phải đợc biết đến nh là các file .
COM, . EXE hay . BAT; hoặc trong UNIX hay LINUX thì cờ khả thi đối với file đó
phải đợc thiết lập.
Mỗi khi Web server gọi một URL mà trỏ đến một kịch bản gateway, thì kịch bản đó
lập tức đợc thực hiện. Sau đó, Web server sẽ đợi kịch bản kết thúc và lấy các kết quả trả
về cho ngời sử dụng. Các gateway có thể lấy các thông tin đầu vào từ ngời sử dụng và trả
về các tài liệu dới dạng các form HTML, các URL khác hay là các dạng dữ liệu khác.
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 10
I.1.2 Common Gateway Interface
CGI là thuật ngữ viết tắt của cụm từ Common Gateway Interface, là một giao diện
chuẩn dùng để trao đổi thông tin giữa các gateway và Web server. Các chơng trình CGI
cho phép quản trị hệ thống tạo ra nhiều ứng dụng tinh vi nhằm chuyên môn hoá và tự
động hoá rất nhiều tác vụ cho ngời dùng: những tiện ích cho phép tìm kiếm CSDL về
thông tin đặc biệt, những tiện ích tìm kiếm theo chỉ mục trên mạng mà chắc chúng ta ai
cũng đã có lần đợc thởng thức.
CGI là một phần của Web Server, có thể giao tiếp với những chơng trình khác chạy
trên Server. Với CGI, Web Server có thể gọi một chơng trình, trong khi dữ liệu của ngời
sử dụng gởi đến chơng trình. Chơng trình sau đó xử lý dữ liệu và Server gởi trả lời của ch-

ơng trình về cho Web Browser.
CGI chỉ là chơng trình với những kiểu đầu vào và vài nguyên tắc nghiêm ngặt trên
đầu ra chơng trình. Mọi thứ ở giữa chỉ là chơng trình. Dĩ nhiên, có những kỹ thuật dành
riêng đặc biệt cho CGI.
Đến đây chúng ta có thể trả lời cho câu hỏi đợc đặt ra ở đầu mục này CGI là gì ? .
CGI là một giao diện giữa các kịch bản do ngời lập trình tạo ra và Web server, giúp
chúng ta mở rộng khả năng của Server. Về mặt lý thuyết CGI giúp chúng ta mở rộng khả
năng của Server trong việc nhận và phân tích thông tin đầu vào từ phía ngời sử dụng và
trên cơ sở các thông tin đầu vào đó sử lý và kết xuất một dầu ra thích hợp. Chúng ta hãy
xem hình vẽ minh hoạ sau :
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 11
I.2 Tại sao dùng CGI ?
Thông thờng, nếu chúng ta muốn mở rộng khả năng của Web server, chính chúng ta
phải sửa đổi Web server đó. Đây thực là cách giải quyết bất lợi vì nó đòi hỏi một kiến
thức chuyên môn cao về lập trình trên mạng thông qua Internet và hiểu biết cặn kẽ về
giao thức World Wide Web. Điều này còn đòi hỏi phải sửa và biên dịch lại mã nguồn của
máy chủ hoặc viết một Custom Server cho mỗi nhiệm vụ. Ví dụ, chúng ta muốn mở rộng
khả năng của Server để nó hoạt động giống nh một Email gateway để nhận mail từ một
Browser và gửi nó đến một Browser khác. Chúng ta cần cài mã vào Server để nó có thể
nhận và phân tích thông tin đầu vào từ Browser và gửi nó đến Browser khác thông qua
môi trờng mạng
Với nhiệm vụ nh vậy, trớc tiên phải truy cập đợc và mã nguồn của Server, điều mà
không phải lúc nào cũng có thể làm đợc. Thứ hai, điều này thì khó với những ngời bình
thờng, đó là phải có kiến thức chuyên môn giỏi. Thứ ba, đó là những cái mà chúng ta đã
cài đặt để mở rộng khả năng của Server chỉ là việc với đợc với Server đó. Nếu chúng ta
muốn chuyển Web server sang hoạt động ở một nền hệ điều hành khác, thì chúng ta phải
bắt đầu lại từ đầu và thời gian chuyển đổi mã nguồn để chạy trong một nền hệ điều hành
khác chắc cũng không phải là ít.
Khả năng to lớn của CGI là tăng thêm sức mạnh cho Web server. CGI mang lại biện

pháp giải quyết đơn giản và gọn ghẽ cho các vấn đề trên. Giao thức CGI đa ra một qui
chuẩn cho các chơng trình khi kết nối với Web Server. Chúng ta có thể lập trình với bất
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
WWW
Browser
Web Server
CGI
Applications
1
2
34
Server
machine
Client
machine
1. Browser gửi Form yêu cầu, cùng các thông tin về chương trình CGI
2. Server gọi chương trình CGI theo yêu cầu của Browser
3. Kết quả từ chương trình CGI trả về cho Server
4. Server đem kết quả nhận được từ CGI trả lời cho Browser
Lập trình CGI bằng Perl trên Linux 12
cứ một ngôn ngữ gì trên một máy tính nào để có thể thực hiện trao đổi thông tin với Web
server mà không cần biết nhiều lắm về kiến thức chuyên môn. Chơng trình mà chúng ta
viết ra sẽ hoạt đông đợc với bất kỳ Web server nào có thể hiểu đợc giao thức CGI. Việc
truyền thông với CGI đợc thực hiện trên cơ sở các thông tin đầu vào và đầu ra qui chuẩn,
có nghĩa là nếu chúng ta biết viết và đọc dữ liệu bằng các ngôn ngữ lập trình bình thờng,
thì chúng ta có thể viết đợc một ứng dụng cho Web server dựa vào công nghệ CGI. Ngoài
việc phân tích thông tin đầu vào và đầu ra việc lập trình các ứng dụng CGI đều giống nh
việc lập trình các ứng dụng khác. Ví dụ, nếu chúng ta muốn viết một chơng trình đơn
giản để hiện dòng chữ Chào bạn ở màn hình của Browser, chúng ta chỉ cần dùng một
lệnh print của ngôn ngữ của chúng ta đang sử dụng và một vài định dạng đợc định nghĩa

cho chơng trình CGI để in các thông tin cho thích hợp.
II Lập trình với CGI
II.1 Lựa chọn ngôn ngữ
CGI là giao diện chung nên ta có thể sử dụng bất kỳ ngôn ngữ nào cho lập trình CGI.
Một vấn đề rất quan trong mà nhiều ngời đặt ra đó là dùng ngôn ngữ nào cho lập trình
CGI thì phù hợp nhất ? . Đây là một câu hỏi không phải dế trả lời, tất nhiên tuỳ theo
mục đích của bài toán có một số ngôn ngữ phù hợp hơn dành cho lập trình CGI. Trớc khi
chọn ngôn ngữ lập trình, cần xem kỹ những đặc tính sau:
Có thể hiển thị thông tin ở đầu ra chuẩn (STDOUT).
Nhận thông tin ở đầu vào chuẩn (STDIN).
Khả năng hiểu và cập nhật biến môi trờng.
Hầu hết tất cả các ngôn ngữ lập trình và các ngôn ngữ Script ngày nay đều đáp ứng đ-
ợc 3 yêu cầu trên. Một vài ngôn ngữ phổ biến thích hợp cho lập trình CGI gồm :
AppleScript, C/C++, C shell, Perl, tcl, Và Visual Basic.
II.1.1 C/C++(Unix, Linux, Windows, Macintosh)
C/C++ là ngôn ngữ thông dụng với các nhà lập trình, một số ngời sử dụng chúng cho
lập trình CGI. Những ngôn ngữ này đòi hỏi những ngời lập trình có chút ít kinh nghiệm.
C và C++ ràng buộc những qui tắc nghiêm ngặt về khai báo biến, bộ nhớ,... Thêm vào đó,
những ngôn ngữ này thiếu tính mở rộng CSDL và những khả năng phù hợp mô hình vốn
có, mặc dù những hàm, môdule có thể đợc viết để thực hiện những chức năng này.
Tuy nhiên, C và C++ có thuận lợi lớn là có thể biên dịch ứng dụng CGI tạo tệp thực
thi nhị phân.
II.1.2 Perl (Unix, Linux, Windows, Macintosh)
Perl là công cụ thông dụng nhất dùng để lập trình CGI, gồm nhiều đặc điểm mạnh, và
dễ dàng cho những ngời mới bắt đầu lập trình. Perl có một số u điểm sau :
Tính linh hoạt cao.
Những phép toán thao tác chuỗi mạnh, nh những chức năng giao tiếp với dữ
liệu nhị phân.
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 13

Cấu trúc đơn giản và ngắn gọn.
II.1.3 Visual Basic (chỉ dùng trên môi trờng Windows)
Visual Basic dùng trong Windows cũng nh những gì mà AppleScript dùng cho hệ
điều hành Macintosh kể cả lập trình CGI cũng tơng tự. Với Visual Basic có thể giao tiếp
những ứng dụng Windows khác nh những CSDL và bảng tính. Vì thế Visual Basic thực
sự là công cụ mạnh cho việc phát triển ứng dụng CGI trên PC, và dễ tiếp cận. Tuy nhiên,
Visual Basic còn thiếu những phép toán thao tác chuỗi.
II.2 Những vấn đề cơ bản trong lập trình CGI
Tuy có nhiều vấn đề kỹ thuật bên trong, nhng chúng ta có thể tinh giảm việc lập trình
CGI thành 2 bớc nh sau: Nhận thông tin từ Web browser và hồi đáp thông tin trở lại.
Thông thờng, browser đợc giới thiệu một Form để nhập dữ liệu. Khi nhập xong dữ liệu
vào Form, browser gửi lên Server và thông tin sẽ đợc chuyển đến chơng trình CGI. CGI
sau đó sẽ phải chuyển đổi thông tin này sang dạng nó có thể hiểu đợc (giải mã thông tin),
xử lý nó và sau đó gửi kết quả lại cho browser có thể kết quả chỉ là một lời chào hay
cũng có thể đó là một kết cục của một cuộc tìm kiếm cơ sở dữ liệu nào đó.
II.2.1 Chơng trình ví dụ
Chúng ta sẽ bắt đầu với vấn đề lập trình truyền thống. Chúng ta muốn viết một chơng
trình hiện dòng chữ Hello World lên màn hình của Browser. Trớc khi viết chơng trình
này, chúng ta cần phải hiểu thông tin gì mà Browser muốn nhận đợc từ CGI. Cũng cần
biết thêm về cách để làm thế nào để chạy chơng trình này và phơng thức hoạt động của
nó. CGI không phụ thuộc vào ngôn ngữ, vì vậy chúng ta có thể thực hiện chơng trình này
bằng bất cứ ngôn ngữ nào mà chúng ta muốn. Chúng ta hãy xem chơng trình Hello
World viết bằng Perl:
#!/usr/bin/perl
# hello.cgi - My first CGI program
print "Content-Type: text/html\n\n";
print "<html> <head>\n";
print "<title>Hello, world!</title>";
print "</head>\n";
print "<body>\n";

print "<h1>Hello, world!</h1>\n";
print "</body> </html>\n";
Lu trữ chơng trình với tên là hello.cgi và đặt nó vào nơi thích hợp (chúng ta sẽ bàn về
cái gọi là nơi thích hợp này sau). Đối với hầu hết mọi ngời th mục thích hợp này đợc
mang tên cgi-bin. Bây giờ, gọi thực hiện chơng trình này từ Web server. Điều đó có nghĩa
là mở một URL.
http://hostname/directoryname/hello.cgi
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 14
hosrtname: Là tên của Web server, directoryname là tên th mục mà chúng ta đã đặt
hello.cgi (có thể là cgi-bin). ở Web browser sẽ xuất hiện nh sau:
Trớc tiên chúng ta đang sử dụng một lệnh print đơn giản. Các chơng trình CGI không
cần bất cứ một chơng trình quản lý file hay một mô tả đặc biệt nào cho đầu ra. Để gửi dữ
liệu đến Browser đơn giản ta chỉ việc dùng lệnh print ra stdout. Thứ hai, chúng ta hãy chú
ý đến nội dung của câu lệnh print đầu tiên (Content-Type: text/html) các tham số trong câu
lệnh này không hiển thị ở màn hình của Web Browser. Chúng ta có thể gửi bất cứ thông
tin gì đến Browser ( có thể là một trang HTML, hay là hình ảnh hoặc âm thanh), nhng tr-
ớc tiên chúng ta cần thông báo cho Browser biết thông tin gì sắp đợc gửi đến. Dòng lệnh
này thông báo cho Browser biết thông tin mà Browser sắp nhận là một trang HTML Thứ
ba, chơng trình của chúng ta đợc đặt tên là hello.cgi. Không cần thiết phải có phần mở
rộng là .CGI. Mặc dù mã nguồn của nhiều ngôn ngữ có các phần mở rộng khác nhau, nh-
ng phần mở rộng là .CGI không phải là cách biểu thị ngôn ngữ mà là cách để Server xác
định, nhận diện file là một file thực hiện đợc chứ không phải là file hình ảnh hay âm
thanh, file HTML hay text file.
Tóm lại hello.cgi có hai vấn đề chính
* Thông báo cho browser biết loại thông tin sẽ nhận (Content-Type: text/html)
* Thông báo cho browser thông tin để hiên thị (Hello, world!)
Để chứng minh sự độc lập của các chơng trình CGI với ngôn ngữ. Chúng ta hãy viết
chơng trình hello.cgi bằng ngôn ngữ C.
/* hello.cgi.c - Hello, world CGI */

#include <stdio.h>
int main() {
printf("Content-Type: text/html\r\n\r\n");
printf("<html> <head>\n");
printf("<title>Hello, World!</title>\n");
printf("</head>\n");
printf("<body>\n");
printf("<h1>Hello, World!</h1>\n");
printf("</body> </html>\n");
}
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 15
Chú ý rằng phiên bản hello.cgi viết bằng Perl chung ta đã sử dụng lệnh
print "Content-Type: text/html\n\n";
Trong khi phiên bản hello.cgi viết bằng C dùng
printf("Content-Type: text/html\r\n\r\n");
Tạo sao câu lệnh print trong Perl lại kết thúc với hai newlines (/n) trong khi với C lệnh
printf kết thúc với hai carriage return và newlines (\r\n) ?
Một cách chính thức, những header (tất cả những thứ nằm phía trớc dòng trống) phải
đợc phân cách bằng một dấu phân cách dòng (carriage return) và một dòng mới
(newline). Trong các hệ thống DOS và Windows thì Perl hiểu \r là một ký tự newline
khác chứ không phải là carriage return.
Qua hai ví dụ lập trình đơn giản trên chúng ta kết luận về việc sử dụng ngôn ngữ nào
để lập trình không ảnh hởng gì đến Web server và Browser. Mặc dù mỗi ngôn ngữ có u
và khuyết điểm riêng trong một vấn đề nào đó.
II.2.2 Outputting CGI
Bây giờ chúng ta chúng ta đã hiểu rõ hơn về việc truyền thông tin cho Web browser.
Nh chung ta đã thấy trong ví dụ Hello World, Web browser nhận đợc hai bộ dữ liệu
(Xem hình vẽ): 1 header chứa thông tin về kiểu của thông tin đề hiển thị ( chẳng hạn nh
dòng Content-Type:) và thông tin thực sự ( những thông tin đợc hiển thị ở Web browser).

Hai khối thông tin này đợc phân cách bằng một dòng trống.
Header đợc gọi là HTTP header. Nó cung cấp thông tin quan trọng về loại thông tin
mà Browser sắp sửa nhận. Có vài kiểu HTTP header khác nhau và loại phổ biến nhất là
loại mà chúng ta đã sử dụng trên đây, header Content-Type.
Bảng liệt kê các HTTP header có thể sử dụng
Header
Mô tả
Content-length Chióửu daỡi cuớa doỡng ra. ồn giaớn laỡ dổợ lióỷu nhở phỏn
Content-type Kióứu nọỹi dung MIME cuớa doỡng ra
Expires Ngaỡy vaỡ thồỡi gian khi taỡi lióỷu khọng phuỡ hồỹp vaỡ seợ
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 16
õổồỹc naỷp laỷi bồới trỗnh duyóỷt
Location Chuyóứn hổồùng Server
Pragma Traớ taỡi lióỷu dỏỳu
Status Traỷng thaùi cuớa yóu cỏửu
Refresh Client naỷp laỷi taỡi lióỷu õaợ õổồỹc Refresh
Set-Cookie Client lổu trổợ taỡi lióỷu õỷc bióỷt, hổợu ờch trong vióỷc giổợ
dổợ lióỷu giổợa caùc yóu cỏửu
Theo sau phần header và dòng trống, chúng ta có thể in những dữ liệu muốn hiển thị.
Nếu muốn truyền một trang HTML hãy in các thẻ HTML và dữ liệu ra stdout sau phần
header. Có thể gửi hình ảnh, âm thanh, hay các file nhị phân cũng đơn giản bằng cách in
nội dung của chúng ra stdout. Sau đây đề cập đến hai header quan trọng nhất.
Tiêu đề Content-Type: header này mô tả kiểu dữ liệu mà chơng trình CGI trả về.
Định dạng thích hợp cho header này là:
Content-Type: subtype/type
Phần subtype/type là một kiểu MIME phù hợp (Multipurpose Internet Mail
Extensions). Dạng MIME phổ biến nhất là kiểu HTML : text/html. Bảng dới đây liệt kê
các kiểu MIME phổ biến.
MIME Type Mô tả

Text/html HyperText Markup Language (HTML)
Text/plain Plain text files
Image/gif GIF graphics files
Image/jpeg JPEG compressed graphics files
Audio/basic Sun *.au audio files
Audio/x-wav Windows *.wav files
Chơng trình CGI có thể trả về hầu nh tất cả các loại tài liệu ảo tơng ứng với những
loại mà browser có thể quản lý. Nó có thể trả về văn bản bình thờng, một HTML file,
hình ảnh, âm thanh, PDF file . . .đó chính là lý do mà trong thông tin mà browser gửi đến
server có kèm theo một danh sách "accept type " mà nó có thể quản lý. Server lu trữ các
thông tin này trong biến môi trờng HTTP_ACCEPT và chơng trình CGI có thể kiểm tra
biến môi trờng này để có thể trả về những định dạng file mà browser có thể chấp nhận.
Khi trả kết quả về cho browser, chơng trình CGI cần đến tiêu đề Content-Type để
báo cho browser loại dc liêu gì mà nó gửi và để cho browser định dạng và hiển thị dữ liệu
theo đúng cách.
Tiêu đề Content-length: header này chỉ ra kích thớc của dữ liệu đợc trả về. Tiêu đề
này đợc áp dụng trong trờng hợp dữ liệu trả về là dữ liệu nhị phân. Để hiểu rõ cách sử
dụng header này chúng ta hãy xét ví dụ sau đây:
#!/usr/bin/perl
$gif_image=join("/", $ENV{'DOCUMENT_ROOT'}, "icons/tiger.gif");
if(open(IMAGE,"<",$gif_image)){
$no_bytes=(stat($gif_image))[7];
print "Content-Type: image/gif\n";
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 17
print "Content-length: $no_bytes\n\n";
print <IMAGE>
}else{
print "Content-Type: text/plain\n\n";
print "Sorry ! I cannot open the file $gif_image";

}
exit (0);
Trong ví dụ trên có hai vấn đề đáng quan tâm. Thứ nhất, cần chú ý đến tiêu đề
content-type là image/gif. Điều này báo hiệu cho browser biết một hình ảnh GIF sắp đợc
gửi đến, do đó browser biết cách để hiển thị nó. Thứ nhì, cần chú ý đến tiêu đề content-
length. Tiêu đề này báo cho server biết kích thớc của dữ liệu của chơng trình cần gửi.
Điều này ngăn ngừa đợc lỗi xảy ra trong khi server thao tác với các tệp nhị phân, bởi vì
server sẽ đọc số bytes đợc chỉ định mà không cần biết đâu là ký tự kết thúc.
Trong ví dụ này để có đợc content-length hợp lý (cỡ của file tiger.gif) chúng ta đã sử
dụng lệnh stat. Lệnh này trả về một mảng gồm 13 thành phần bao gồm thông tin về file
đợc đa ra trong tham số của lệnh. Trong đó thành phần thứ 8 là kích thớc của file (chú ý
chỉ số mảng trong Perl bắt đầy từ 0).
II.2.2 Sơ lợc về HTML Forms
Một trong những tính năng nổi bật nhất của CGI là xử lý các Forms. Forms là một
phần của HTML cho phép ngời sử dụng cung cấp thông tin. Giao tiếp Forms tạo cho trình
duyệt Web một quá trình tơng tác giữa ngời sử dụng và ngời cung cấp.
Hình vẽ : Sự tơng tác giữa form và CGI
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Chấp nhận
USER
User yêu
cầu form
User điền
T.tin form
Gởi form về
cho Client
User gởi
form
Gởi đến ứng
dụng CGI

Gởi về cho
Client
Xử lý
dữ liệu
Hiển thị
Gởi về cho
Client
NETWORK
Application
SerVer
WWW Browser
(On client)






CGI
Lập trình CGI bằng Perl trên Linux 18
II.2.2.1 Thẻ FORM
Dòng bắt đầu của một form:
<Form ACTION=http:/192.0.1.1/cgi-bin/program.cgi METHOD=Post>
Thẻ Form khởi đầu một form. Tài liệu có thể chứa nhiều forms, các forms không thể
lồng vào nhau, form này không đợc phép đặt trong form kia.
Hai thuộc tính trong thẻ <FORM> là ACTION và METHOD rất quan trọng. Thuộc
tính ACTION xác định URL của chơng trình CGI xử lý dữ liệu. Không hạn chế phải đặt
chơng trình trên Server của bạn, có thể xác định URL trên một Host từ xa nếu chơng trình
cho phép làm điều đó.
Thuộc tính METHOD xác định cách thức Server gởi thông tin từ form đến chơng

trình CGI. POST gởi dữ liệu qua đầu vào chuẩn, trong khi GET gởi thông tin qua các biến
môi trờng. Nếu không có phơng thức nào xác lập, Server sẽ ngầm định là GET. Cả hai ph-
ơng thức đều có những u điểm và nhợc điểm của nó.
II.2.2.2 Trờng text và Password
Hầu hết các phần tử đợc thi hành sử dụng thẻ <INPUT>. Thuộc tính TYPE của
<INPUT> xác định kiểu của đầu vào là gì. Một số loại khác nhau: nh trờng text,
password...Sau đây là ví dụ của đầu và text:
Name: <Input Type=text Name=User Size=40><BR>
Password: <Input Type=password Name=pass Size=10><BR>
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 19
Trờng hợp này trờng text và trờng password đợc tạo ra nhờ sử dụng các đối số text,
password, trờng password cũng tơng tự nh trờng text nhng chỉ khác là các tự đánh vào
đợc hiển thị dới dạng dấu *. Nếu bỏ qua thuộc tính TYPE, trờng text sẽ mặc định.
Thuộc tính NAME xác định tên của phần tử đầu vào. Nó không hiển thị bởi trình
duyệt, nhng đợc sử dụng để nhận dữ liệu khi chuyển tới chơng trình CGI. Ví dụ, trờng
vào có tên Name=user, nếu ai đó đánh the vào trờng đó, thì phần dữ liệu gởi đến
trình duyệt là: user=the.
II.2.2.3 Nút Reset và Submit
Hai kiểu quan trọng của thẻ <INPUT> là Submit và Reset.
<Input Type=submit Value=Gởi dữ liệu >
<Input Type=reset Value=Xoá dữ liệu >
Hầu hết các forms đều cung cấp hai nút Submit và Reset. Nút submit gởi tất cả
thông tin từ form đến chơng trình CGI xác định bởi thuộc tính ACTION. Không có nút
này, form sẽ không gởi đợc dữ liệu đến chơng trình CGI. Nút Reset xoá tất cả thông tin
đánh vào của ngời sử dụng, ngời sử dụng có thể nhấn reset nếu muốn nhập lại dữ liệu.
II.2.2.4 Tham chiếu một số tags
Sau đây giới thiệu một danh sách ngắn các tags Form:
Các thẻ Form Mô tả
<FORM ACTION=cgi-bin/pro.exe METHOD=Post> Khởi đầu Form

<Input TYPE=text NAME=name VALUE=value SIZE=size> Trờng text
<Input TYPE=password NAME=name VALUE=value SIZE=size> Trờng mật khẩu
<Input TYPE=hidden NAME=name VALUE=value Trờng ẩn
<Input TYPE=Checkbox NAME=name VALUE=value Hộp kiểm tta
<Input TYPE=Radio NAME=name VALUE=value Nút Radio
<Select NAME=name SIZE=1>
<Option selected >Một
<Option selected >Hai
..
Menu
</Select>
<Input TYPE=Submit NAME=name VALUE=value Nút gởi
<Input TYPE=Reset NAME=name VALUE=value Nút xoá
</FORM> Kết thúc FORM
II.2.3 Input CGI
Trong ví dụ Hello World chúng ta đã xem xét ở phần trớc, ta đã biết cách viết một
chơng trình CGI truyền thông tin từ Server đến Browser. Trong thực tế thì một chơng
trình CGI chỉ xuất dữ liệu không thôi thì không có nhiều vấn đề lắm để bàn. Chúng ta
đang bàn đến một khả năng quan trọng của CGI đó là: nhận thông tin từ Web browser,
đặc tính này tạo nên cho Web khả năng tơng tác một cách tự nhiên.
Một chơng trình CGI khi đợc gọi thực hiện nó sẽ nhận đợc hai loại thông tin sau:
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 20
- Thứ nhất, các loại thông tin khác nhau về browser (browser type, thông tin gì
browser có thể hiển thị ?, tên máy tính ở xa, v.v..), thông tin về Server ( tên và phiên bản
phần mềm Server đang chạy, cổng, v.v..) và về bản thân chơng trình CGI (tên chơng trình
và đờng dẫn). Server cung cấp cho CGI tất cả các thông tin này thông qua các biến môi
trờng.
- Thứ nhì, chơng trình CGI có thể nhận đợc những thông tin mà ngời sử dụng nhập
vào. Những thông tin này, trớc tiên đợc browser mẫ hoá sau đó gửi đi thông qua các biến

môi trờng (phơng trức GET) hoặc là đầu vào chuẩn (stdin- phơng thức POST).
Các biến môi trờng
Hiểu biết về những biến môi trờng có thể sử dụng cho chơng trình CGI là một
điều rất hữu ích, giúp cho việc học lập trình CGI và là công cụ gỡ rối rất tốt. Bảng dới đây
liệt kê các biến môi trờng khả dụng trong lập trình CGI. Chúng ta có thể viết một chơng
trình in tất cả các biến môi trờng này ra.
Bióỳn mọi trổồỡng Mọ taớ
GATEWAY_INTERFACE Phión baớn CGI server sổớ duỷng
SERVER_NAME Tên cuớa Server hoỷc õởa chố IP
SERVER_SOFTWARE Tón vaỡ phión baớn cuớa phỏửn móửm Server õang
duỡng
SERVER_PROTOCOL Tón vaỡ phión baớn giao thổùc thọng tin õi cuỡng
SERVER_PORT Sọỳ cọứng cuớa Host maỡ Server õang chaỷy
REQUEST_METHOD Phơng thổùc yóu cỏửu thọng tin
PATH_INFO Thọng tin õổồỡng dỏựn phuỷ trồỹ õóỳn chổồng trỗnh
CGI
PATH_TRANSLATED Phión baớn bión dởch cuớa õổồỡng dỏựn cho bồới
bióỳn PATH_INFO
SCRIPT_NAME ổồỡng dỏựn aớo cuớa Script seợ õổồỹc thổỷc thi
DOCUMENT_ROOT Thổ muỷc gốc của Web õổồỹc phuỷc vuỷ
QUERY_STRING Thọng tin truy vỏỳn õóỳn chổồng trỗnh
REMOTE_HOST Hostname tổỡ xa mà ngổồỡi sổớ duỷng yóu cỏửu đến
REMOTE_ADDR ởa chố IP tổỡ xa cuớa ngổồỡi sổớ duỷng taỷo nón
yóu cỏửu
AUTH_TYPE Phổồng thổùc kiểm tra đặc quyền
REMOTE_USER Tón xaùc nhỏỷn ngổồỡi sổớ duỷng
CONTENT_TYPE Kióứu MIME cuớa dổợ lióỷu truy vỏỳn, nhổ text/html
REMOTE_IDENT Ngổồỡi sổớ duỷng taỷo yóu cỏửu. Bióỳn naỡy chố
õổồỹc thióỳt lỏỷp nóỳu cồỡ identitycheck õổồỹc pheùp,
vaỡ maùy client họứ trồỹ sồ õọử nhỏỷn bióỳt (rfc 931)

CONTENT_LENGTH Chióửu daỡi dổợ lióỷu (byte hoỷc sọỳ kyù tổỷ) õóỳn
chổồng trỗnh cgi thọng qua õỏửu vaỡo chuỏứn.
HTTP_FROM ởa chố email cuớa ngổồỡi sổớ duỷng taỷo yóu cỏửu.
Hỏửu hóỳt trỗnh duyóỷt khọng họứ trồỹ bióỳn naỡy.
HTTP_ACCEPT Danh saùch kióứu MIME kióứu client cỏỷp nhỏỷt
HTTP_USER_AGENT Trỗnh duyóỷt client õang duỡng phỏn phaùt yóu cỏửu
HTTP_REFERER URL cuớa taỡi lióỷu chố õóỳn trổồùc khi cỏỷp nhỏỷt
chổồng trỗnh cgi
Để viết chơng trình CGI cho phép hiển thị các biến môi trờng, chúng ta cần làm hai
việc:
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 21
- Xác định rõ tất cả các biến môi trờng và giá trị tơng ứng của chúng
- In kết quả ra màn hình browser
Việc xuất dữ liệu đến browser chúng ta đã biết trong chơng trình Hello World.
Trong Perl, các biến môi trờng đợc lu trữ trong (associative array) %ENV (sẽ bàn đến
sau), với khoá là tên của biến môi trờng. Đoạn chơng trình dới đây sẽ in ra tất cả các biến
môi trờng và giá trị của chúng.
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html> <head>\n";
print "<title>CGI Environment</title>\n";
print "</head>\n";
print "<body>\n";
print "<h1>CGI Environment</h1>\n";
foreach $env_var (keys %ENV) {
print "<B>$env_var</B> = $ENV{$env_var}<BR>\n";
}
print "</body> </html>\n";
Chơng trình thực hiện công việc tơng tự đợc viết bằng C

env.cgi.c
/* env.cgi.c */
#include <stdio.h>
extern char **environ;
int main()
{
char **p = environ;
printf("Content-Type: text/html\r\n\r\n");
printf("<html> <head>\n");
printf("<title>CGI Environment</title>\n");
printf("</head>\n");
printf("<body>\n");
printf("<h1>CGI Environment</h1>\n");
while(*p != NULL)
printf("%s<br>\n",*p++);
printf("</body> </html>\n");
}
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 22
Lợc đồ mã hoá dữ liệu đầu vào
Khi ngời sử dụng gởi (Submit) một form, trớc tiên browser phải mã hoá thông tin trớc
khi gửi nó đến cho Server và sau đó đến chơng trình CGI. Khi sử dụng thẻ <INPUT>, mỗi
trờng sẽ đợc đặt một tên tợng trng - có thể xem là một biến, mà giá trị của biến này sẽ là
nội dung mà ngời sử dụng nhập vào. Nh vậy, nếu nh form có nhiều thẻ <INPUT> thì dữ
liệu của form sau khi đợc Submit sẽ là một danh sách các cặp tênbiến/giátrị. Sẽ có sự
nhầm lẫn ở đây, làm sao ta phân biệt đợc đâu là biến, đâu là trị trong danh sách nói trên.
Để giải quyết vấn đề này Browser sử dụng cái gọi là URL Encoding. Nội dung của
URL Encoding có thể đợc tóm tắt nh sau:
- Phân cách các trờng khác nhau bằng dấu và "&".
- Phân cách tên biến và giá trị của nó bằng dấu "=", với tên biến ở bên trái và giá

trị ở bên phải.
- Thay thế các khoảng trống bằng dấu cộng "+".
- Thay thế tất cả các ký tự "không bình thờng" bằng dấu phần trăm (%) theo sau là
hai ký số hệ cơ số 16 (mã của ký tự đó).
Các ký tự "không bình thờng" và giá trị ở hệ cơ số 16 của chúng
Character Hexadecimal Value
Tab 09
Space 20
" 22
( 28
) 29
, 2C
. 2E
; 3B
: 3A
< 3C
> 3E
@ 40
[ 5B
\ 5C
] 5D
^ 5E
' 60
{ 7B
| 7C
} 7D
? 3F
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 23
& 26

/ 2F
= 3D
# 23
% 25
Để minh họa vấn đề vừa trình bày, chúng ta xem xét một form nh sau:
<html> <head>
<title>Name and Age</title>
</head>
<body>
<form action="http://192.0.1.1/cgi-bin/nameage.cgi" method=POST>
Enter your name: <input type=text name="name"><p>
Enter your age: <input type=text name="age"><p>
Enter your email: <input type=text name="email"><p>
<input type=submit>
</form>
</body> </html>
Giả định ngời sử dụng nhập vào Nguyễn Hoàng Việt ở trờng name, 23 ở trờng age,
ở trờng email
Name Nguyễn Hoàng Việt
Age 23
Email
Theo thủ tục để mã hóa những cặp này, trớc tiên browser phải thay thế những ký tự
"bất bình thờng". Trong ví dụ này, chỉ có ký tự tự @ và nó đợc thay thế bởi %40. Và bây
giờ chúng ta có:
Name Nguyễn Hoàng Việt
Age 23
Email Bcuong%40dng.vnn.vn
Tiếp đến thay thế tất cả các ký tự trống bằng dấu cộng "+"
Name Nguyễn+Hoàng+Việt
Age 23

Email Bcuong%40dng.vnn.vn
Phân cách tên biến và giá trị bởi dấu bằng "="
Name=Nguyễn+Hoàng+Việt
Age=23
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 24
Email=Bcuong%40dng.vnn.vn
Cuối cùng phân biệt mỗi cặp bằng một dấu "&"
Name=Nguyễn+Hoàng+Việt&Age=23&Email=Bcuong%40dng.vnn.vn
Biến môi trờng Content-Length đợc đặt giá trị là số ký tự của chuỗi dữ liệu đã đợc mã
hoá này. Trong ví dụ này là 55 ký tự, do đó Content-Length là 55.
Sự khác nhau giữa GET và POST
Sau khi dữ liệu đầu vào đợc mã hoá, chúng ta có hai cách gửi thông tin đến Web
server và chơng trình CGI đó là thông qua một trong hai phơng thức GET và POST. Nh
vậy thì điểm khác nhau giữa hai phơng thức này là gì ?
Theo phơng thức GET chuỗi đầu vào đợc truyền đến chơng trình CGI bằng cách thêm
thông tin vào phía sau của URL. Ví dụ, để truyền chuỗi đầu vào:
name=Nguyễn+Hoàng+Việt&age=23&email=bcuong%40dng.vnn.vn đến chơng
trình CGI program.cgi, browser phải thêm một dấu "?" vào sau của URL và theo sau là
thông tin. Nh vậy URL của chúng ta sẽ có dạng nh sau:
http://192.0.1.1/cgi-bin/program.cgi?
name=Nguyễn+Hoàng+Việt&age=23&email=bcuong%40dng.vnn.vn
Tất cả những phần trong URL nằm phía sau dấu "?" đợc lu trữ trong biến môi trờng
QUERY_STRING. Sau đó chơng trình CGI sẽ phân tích chuỗi này thành dạng nó có thể
hiểu đợc.
Phơng thức GET có vài vấn đề cố hữu: Thứ nhất, cỡ của chuỗi đầu vào bị hạn chế bởi
kích thớc của biến môi trờng QUERY_STRING. Nói chung chúng ta không thể có một
QUERY_STRING lớn hơn 1KB (1024 ký tự). DO đó GET không làm việc đợc với các
form với khối lợng dữ liệu lớn. Thứ nhì, chúng ta sẽ có những URL dài dòng và sấu xí, dễ
gây ra sai xót trong việc nhập URL.

Một phơng pháp khác để gởi dữ liệu đến Server đó là sử dụng phơng thức POST.
Phơng thức GET truyền dữ liệu thông qua biến môi trờng QUERY_STRING, trong
khi đó POST chuyển nó thông qua stdin. POST là phơng thức thờng đợc sử dụng hơn, đặc
biệt là đối với những form chứa nhiều dữ liệu, bởi vì không bị hạn chế về số lợng dữ liệu
gửi đi. Tuy nhiên đối với các form ít dữ liệu thì GET vẫn hay đợc sử dụng, hơn nữa GET
là phơng thức ngầm định khi ta không khai báo cụ thể trong tham số METHOD.
Để xác định phơng thức nào đang đợc sử dụng, chơng trình CGI kiểm tra biến môi tr-
ờng mang tên REQUEST_METHOD, khi chơng trình chạy biến môi trờng này sẽ nhận
một trong hai giá trị là GET hoặc POST. Nếu nhận giá trị là POST thì độ dài của thông tin
đợc mã hoá và lu trữ trong biến môi trờng mang tên CONTENT_LENGTH.
Thuật toán giải mã
Nh ta đã biết chơng trình CGI nhận đợc dữ liệu là một chuỗi đã đợc mã hoá bởi
browser. Để thông tin trở nên có thể sử dụng đợc chơng trình CGI cần giải mã thông tin
nhận đợc theo đúng cách. Trớc hết, chơng trình cần xác định dữ liệu đợc gởi theo phơng
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông
Lập trình CGI bằng Perl trên Linux 25
thức nào. Điều này có thể thực hiện bởi việc xem giá trị trong biến môi trờng
QUERY_METHOD. Nếu giá trị chỉ định yêu cầu GET, thì hoặc chuỗi query hoặc thông
tin đờng dẫn phụ trợ đợc chứa trong biến môi trờng. Mặt khác, nếu là yêu cầu POST, số
bytes xác định bởi biến môi trờng CONTENT_LENGTH phải đợc đọc từ đầu vào chuẩn.
Sau đây là thuật toán giải mã:
1. Xác định phơng thức yêu cầu(GET hay POST) bởi kiểm tra biến môi trờng
REQUEST_METHOD.
2. Nếu phơng thức là GET, đọc chuỗi query từ biến QUERY_STRING và
thông tin đờng dẫn phụ trợ từ biến PATH_INFO.
3. Nếu phơng thức là POST, xác định kích thớc của yêu cầu nhờ biến
CONTENT_LENGTH và đọc nó từ đầu vào chuẩn.
4. Chia chuỗi query bởi ký tự & thành những cặp khoá-trị (key-value&key-
value...).
5. Thay thế các ký tự + bằng ký tự trống trong các cặp key-value.

6. Thay thế các số hecxa bằng các ký tự thực tơng ứng
7. Hình thành bảng khoá-trị (key-value) với khoá là chỉ mục.
Chú ý rằng thứ tự của các bớc trong thuật toán là hết sức quan trọng. Nếu không tuân
theo thứ tự này thì kết qủa giải mã sẽ sai, thông tin nhận đợc sẽ bị nhầm lẫn.
Thủ tục parse_input_data
Sub parse_input_data
local (*in) = @_ if @_;
local ($i, $key, $val);
# Read in text
if (&MethGet) {
$in = $ENV{'QUERY_STRING'};
} elsif (&MethPost) {
read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
}
@in = split(/[&;]/,$in);
foreach $i (0 .. $#in) {
# Chuyển dấu cộng thành khoảng trống
$in[$i] =~ s/\+/ /g;
# Hình thành cặp (key, value) từ mảng @in.
($key, $val) = split(/=/,$in[$i],2); # splits on the first =.
# Chuyển %XX từ dạng số hexa thành dạng alphanumeric của chúng
$key =~ s/%(..)/pack("c",hex($1))/ge;
$val =~ s/%(..)/pack("c",hex($1))/ge;
# tập hợp các key và value thu đợc vào một mảng liên hợp
$in{$key} .= "\0" if (defined($in{$key})); # \0 is the multiple separator
Nguyễn Hoàng Việt Khoa Công nghệ thông tin-Điện tử viễn thông

×