Nghiên cứu lập trình với ngôn ngữ Perl - Pdf 33

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 )

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

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 . . .

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

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ụ

ơ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

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

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 */

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ả

}
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

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

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)

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á

/ 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

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.


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status