Giới thiệu chung
Lập trình CGI bao gồm việc thiết kế và viết các chơng trình, thông thờng các chơng trình này đợc khởi động từ các trang Web (thông qua việc sử dụng form HTML các trang Web sẽ khởi động chơng trình CGI).
HTML form trở thành phơng thức đợc chọn để truyền dữ liệu thông qua mạng bởi vì cách dễ nhất để thiết lập user-interface là sử dụng các tag: HTML form và Input. Với HTML form, chúng ta có thể thiết lập đợc các cửa sổ nhập dữ liệu (input window), các pull-down menu, các hộp chọn (check boxes), các nút lựa chọn kiểu radio button... Hơn nữa, dữ liệu từ nhiều kiểu khác nhau sẽ đợc tự động mã hoá và gửi cho server khi sử dụng HTML form, điều này rất quan trọng trong việc bảo đảm an toàn dữ liệu. Tuy nhiên, các chơng trình CGI không nhất thiết phải khởi động bởi trang Web sử dụng HTML form, chúng có thể đợc khởi động nhờ việc thực hiện lệnh server side include, thậm chí, có thể khởi động ch- ơng trình CGI từ dãy lệnh của server. Nhng việc khởi động chơng trình CGI từ dãy lệnh có thể làm cho chơng trình không thực hiện theo yêu cầu mong muốn hoặc đặt ra khi thiết kế. Lý do của việc này là do chơng trình CGI thờng chạy trong một môi trờng riêng biệt so với môi trờng cảu hệ điều hành trên server.
Môi trờng này là do Web Server tạo ra. Trớc khi các chơng trình CGI đợc khởi động thì Web Server đã tạo ra một môi trờng xử lý đặc biệt dành riêng cho các chơng trình CGI. Môi trờng này bao gồm việc biến đổi tất cả các HTTP request thành các biến môi trờng.
Tiếp theo, server sẽ cố gắng xác định kiểu file hoặc chơng trình đang đợc gọi bởi vì server phải thực hiện những công việc khác nhau dựa vào kiểu file mà nó đang gọi. Vì thế, đầu tiên Web Server phải tìm phần mở rộng của file để xác định xem nó phải tìm kiếm và thực hiện các lênh server side include trong file hay khởi đoọng Perl để biên dịch và chạy file theo kiểu từng dòng lệnh hoặc phải tạo ra các header HTML tơng ứng và trả lời lại một file HTML.
Sau khi server khởi động các server side include hoặc các chơng trình CGI (thậm chí là các file HTML). CGI đợi các kiểu trả lại từ server side include hoặc chơng trình CGI. Nếu server đang trả lại kiểu file HTML thì CGI sẽ đợi file trả lại là dạng text với các nhãn HTML và phần dữ liệu text trong file đó. Khi server trả
lại file kiểu HTML thì nó cũng tạo ra các header HTML, các header này sẽ báo cho trình duyệt phía Client biết kết quả yêu cầu của client đối với một trang Web và kiểu dữ liệu mà Browser phía client sẽ nhận đợc.
File server side include (SSI) làm việc giống nh file HTML thông thờng, chỉ có một điểm khác biệt là server sẽ tìm lệnh server side include tại mỗi dòng trong file. Nếu tìm thấy một lệnh server side include thì server sẽ thực hiện lệnh này và kết quả sẽ đợc chèn vào vị trí đặt câu lệnh SSI trong file khi trả lại cho client. Server trả lại phần mở rộng của file do client yêu cầu để xác định xem file đó có phải là file SSI hay không. File SSI phải có phần mở rộng .shtml
Nếu server xác định rằng file do client yêu cầu phải thực hiện nh chơng trình CGI thì nó sẽ thực hiện chơng trình đó. Sau khi server thực hiện xong chơng trình, thì chơng trình CGI sẽ phải trả lời client tối thiểu bao gồm một số header HTML và một vài nhãn HTML.
Ví dụ: nếu chơng trình CGI trả lời client dạng HTML thì nó phải trả lại một header content. type: text/html.
Lập trình CGI là gì?
Lập trình CGI là việc viết chơng trình, chơng trình sẽ nhận và biến đổi dữ liệu đ- ợc truyền trên Internet giữa Web Server và Web Client.
Chơng trình CGI sẽ thực hiện chức năng nh gateway (cửa khẩu) hoặc interface (giao diện) giữa các ứng dụng khác nhau. Chơng trình CGI thông thờng đợc viết bởi ngôn ngữ scrip nh Perl. Ví dụ một ứng dụng tra cứu danh bạ điện thoại trên Internet đợc xây dựng nh sau.
Khi có yêu cầu tra cứu đợc gửi đi từ client thông qua trang web sử dụng HTML form thì các yêu cầu đó đợc gửi tới chơng trình CGI. Chơng trình CGI sẽ biến đổi chơng trình này thành một dạng dữ liệu thích hợp cho cơ sở dữ liệu chứa dạnh bạ, sau đó chơng trình CGI sẽ truyền dữ liệu đó tới cơ sở dữ liệu. Cơ sở dữ liệu sau khi nhận đợc yêu cầu thì tiến hành thực hiện yêu cầu đó, sau khi thực hiện xong sẽ trả lại kết quả cho chơng trình CGI, chơng trình CGI sẽ biến đổi kết quả thành dạng dữ liệu thích hợp và chuyển lại cho client.
HTML, HTTP và chơng trình CGI phải làm việc cùng với nhau để tạo ra ứng dụng trực tuyến trên Internet.
HTML code định nghĩa giao diện chơng trình.
HTTP là phơng thức vận chuyển dùng để truyền dữ liệu giữa chơng trình CGI và Client.
Chơng trình CGI sẽ lấy các yêu cầu từ client, sau đó chuyển tới server đồng thời trả lại client kết quả tả lời của server đối với yêu cầu của client.
Nguyên tắc HTML
HTML đợc thiết kế cho dữ liệu một kiểu dạng text riêng biệt. Nó thực hiện các chức năng đó thông qua các nhãn (HTML tag). HTML có thể gọi chơng trình CGI thông qua nhãn <form> hoặc nhãn liên kết <a href>. Việc sử dụng nhãn <form> cho phép ngời sử dụng có thể gửi một số dữ liệu không cố định tới server thông qua chơng trình CGI. Tiện hơn là việc dùng nhãn liên kết <a href> giống nh:
<a href = "tên chơng trình CGI"> Text</a>
Cách gọi chơng trình CGI trong nhãn liên kết đơn giản hơn nhiều so với việc sử dụng form HTML. Giả sử chúng ta tạo một liên kết tới chơng trình CGI, nó có dạng nh sau:
<a href = www.pratical-inet.com/cgibook/chap1/program.cgi/extra-path- info?test-nA CGI program</a>
Trong liên kết này: PATH_INFO có giá trị: extra-path-info QUERY_STRING có giá trị: test = test-n
HTML form thực hiện chức năng gửi các dữ liệu biến đổi tới chơng trình CGI. Ngời sử dụng có thể thông qua HTML form để gửi các bức th, điền nội dung vào phiếu đăng ký... Với cách sử dụng HTML form có thể xây dựng đợc các trang Web theo cơ chế hỏi đáp giữa ngời sử dụng và server.
Các HTTP header
Dữ liệu đợc tập hợp bởi Browser rồi gửi tới chơng trình CGI thông qua HTTP header. Các HTTP haeder cơ bản dùng để bắt đầu việc truyền dữ liệu giữa Browser và Web Server là GET và POST.
Nếu nhãn HTML gọi chơng trình CGI có dạng sau:
thì HTTP header method ngầm định GET đợc sử dụng để truyền dữ liệu với ch- ơng trình CGI. Thuộc tính Method của nhãn form sẽ định nghĩa kiểu HTP header method đợc sử dụng để truyền dữ liệu giữa Browser và chơng trình CGI.
Khi phơng thức gửi dữ liệu tới chơng trình CGI đã xác định thông qua HTTP header method, thì dữ liệu đợc gửi đi theo một trong hai cách: Nếu phơng thức GET đợc sử dụng, thì dữ liệu đợc gửi đi thông qua trờng Uniform Resonce Identifier (URI), còn nếu phơng thức POST đợc sử dụng thì dữ liệu đợc gửi đi sẽ giống nh các gói tin riêng biệt.
Sau khi Browser đã xác định đợc dữ liệu mà nó sẽ gửi đi theo phơng thức nào thì nó tạo ra một HTTP request header, HTTP request này để xác định chơng trình CGI sẽ nhận dữ liệu nằm ở vị trí nào trên server. Server sử dụng các HTTP request header để tìm chơng trình CGI và khởi động nó.
Browser sử dụng HTTP request header này để xác định kiểu sử dụng dữ liệu nh dữ liệu dạng văn bản; hình ảnh...
Các th mục trên server
Thông thờng server đợc chia làm hai cây th mục (cây th mục bao gồm một cây th mục chính và các cây th mục con nằm dới nó). Hai cây th mục đó gọi là server root và document root.
Server Root
Server root bao gồm tất cả các file thuộc quyền quản lý của Web Master hoặc System Adimitrator. Dới server root là hai cây th mục cần phải để ý. Đó là các th mục log và conf (trong các server NCSA), trong các hệ server khác, chúng có thể có tên khác nhng tính chất thì nh nhau.
-Th mục Log:
Đây là nơi chứa các file log. Trong ht mục log còn chứa các file error.log. Một file log khác cũng đáng quan tâm là file access. File này thông thờng đợc sử dụng để đếm số lần truy nhập vào Web.
-Th mục conf:
Th mục conf chứa chủ yếu là hai file: access. conf và srm.conf, ngoài ra còn có thể có các file khác. Hai file này giúp cho chúng ta biết đợc các giới hạn của Web server, nơi đặt các chơng trình trong server...
Document root
Là nơi chứa các file HTML phục vụ cho các truy nhập của các Web Client. Dới th mục document root có thể tạo ra nhiều các th mục con.
Bảo vệ, quyền hạn, các đặc quyền đối với file (File Privileges, Permissions, Protection).
Nếu chúng ta sử dụng Perl để tạo ra các chơng trình CGI thì các chơng trình CGI vừa có dạng là file văn bản vừa có dạng là file thực hiện. Các th mục là một dạng file đặc biệt đợc thực hiện bởi server. Các th mục chứa các directive cho phép server biết đợc vị trí của một nhóm file nào đó.
Mỗi một kiểu file trên đều có ba tập hợp quyền hạn, trong đó, mỗi tập hợp quyền hạn có 3 thuộc tính: Read, Write và Execute.
-Read cho phép mở file ra để đọc nội dung nhng không cho phép sửa nội dung file.
-Write cho phép file đợc mở ra để sửa.
-Execute cho phép file thực hiện một số chức năng nào đó. Quyền này đợc áp dụng cho cả hai loại file: file chơng trình và th mục (trong Unix).
Với các trang Web đợc mở ra cho bất kỳ ngời nào đó trên mạng thì nó phải đợc đặt thuộc tính read. Với các chơng trình CGI đợc thực hiện bởi bất kỳ ai trên mạng thì nó phải đợc đặt thêm thuộc tính execute. Để đặt các thuộc tính cho file, thì dùng lệnh chmod. Lệnh chmod chấp nhận sử dụng hai tham số để đặt các thuộc tính cho file.
Tham số thứ nhất là permission mark, tham số thứ hai là file muốn đặt thuộc tính.
Permission mark bao gồm 3 số, mỗi một số sẽ định nghĩa quyền cho mỗi cấp truy nhập khác của file. Số thứ nhất nghĩa là quyền của owner; số thứ hai định nghĩa quyền của group và số th ba định nghĩa quyền của các nhóm khác.
Thuộc tính Read có giá trị 4, thuộc tính Write có giá trị2, thuục tính Execute có giá trị 1. Cộng 3 giá trị này chúng ta đợc một số định nghĩa quyền cho một cấp truy nhập.
Ví dụ: Muốn đặt quyền Read, Write, Execute (4 + 2 + 1) cho owner, Read và Execute (4 + 1) cho group chứa owner và Execute (1) cho các user khác thì permission mark là 751 và lệnh chmod có dạng nh sau:
chmod751 (filename)
Nếu muốn user thuộc group khác đợc sử dụng các file trong một th mục nào đó, thì file đặt thuộc tính Execute cho directory.
Trong Unix, chúng ta còn sử dụng lệnh umask để đặt ngầm định file-creation cho các quyền. Lệnh umask làm việc ngợc lại so với lệnh chmod. Ngầm định giá trị umask là 0 điều này có nghĩa mọi file đợc tạo ra có đầy đủ các quyền do lệnh chmod tạo ra. Thông thờng umask có giá trị 022. Với umask, các file đợc tạo ra sẽ bị xoá mọi quyền Write đối với group và other group.
Mẫu lập trình CGI
Có hai câu hỏi quan trọng nhất đối với lập trình CGI là: - Chơng trình CGI là gì?
- Tao sao chơng trình mẫu này lại khác nhau?
Câu trả lời thứ nhất là chơng trình CGI làm việc nh các chơng trình giao diện hoặc cổng nối giữa Client Browser, Web Server và các ứng dụng lập trình cơ bản.
Câu trả lời thứ hai cần chia làm ba phần. Mỗi phần định nghĩa các môi trờng làm việc khác nhau của chơng trình CGI.
Dới các môi trờng này, chơng trình CGI làm việc và nó tạo ra sự khác nhau so với các mẫu lập trình khác. Đầu tiên, các chơng trình CGI phải mở rộng sự quan tâm tới bảo mật. Tiếp theo, ngời lập trình CGI phải hiểu dữ liệu đợc truyền tới các chơng trình nh thế nào. Cuối cùng, ngời lập trình CGI phải học cách phát triển phần mềm trong môi trờng, nơi mà chơng trình không có phơng thức xây dựng từ trớc để có khả năng xoá nó.
Các chơng trình CGI và vấn đề bảo mật
Tại sao các chơng trình CGI phải quan tâm tới việc mở rộng bảo mật? Điều quan tâm chính là các lập trình viên. Các chơng trình CGI chạy dới một môi tr- ờng không an toàn, bởi vì theo tự nhiên, các chơng trình này phải cho phép thực hiện bởi bất cứ ai đó trên mạng, hơn nữa nó có thể đợc thực hiện tại bất cứ thời điểm nào và nó có thể thực hiện lặp đi lặp lại khi có ngời muốn tìm kiếm những lỗ hổng về bảo mật trong chơng trình.
Chính vì Net là nơi mà bất cứ một ai cũng có thể tìm kiếm và khám phá lỗi của nó nên vấn đề mở rộng bảo mật là điều đáng quan tâm. Hơn nữa, các chơng
trình CGI viết bằng các ngôn ngữ lập trình phiên dịch giống nh Perl thì phần mã nguồn rất dễ bị truy nhập bất hợp pháp.
Các ph ơng pháp truyền dữ liệu của CGI
Các cách truyền dữ liệu trên Internet là một khía cạnh quan trọng nhất của ch- ơng trình CGI. Chơng trình CGI khó có thể thiết kế đợc nếu chúng ta không hiểu đợc cách dữ liệu đợc truyền nh thế nào trên Internet thông qua kết nối HTML hoặc các trờng trong HTML form.
Khi thiết kế chơng trình CGI, điều đầu tiên phải thiết kế khuôn dạng dữ liệu do ngời sử dụng nhập vào. Khuôn dạng này đợc cố định bởi hai cách truyền: GET và POST. Cả hai cách này đều sử dụng các HTTP header để truyền dữ liệu với chơng trình CGI và gửi dữ liệu.
Môi tr ờng không trạng thái của CGI
Việc thực hiện của giao thức không trạng thái HTTP có tác động lớn đến việc thiết kế các chơng trình CGI. Mỗi một hành động của giao thức không trạng thái HTTP đều không liên quan tới các hành động trớc đó, điều này dẫn tới việc, trong cùng một thời điểm có nhiều phiên bản của một chơng trình CGI đợc thực hiện. Vấn đề này có tác động lớn tới việc CGI truy nhập file và dữ liệu.
Các mẫu chwong trình cổ điển sử dụng nguyên lý logic tuần tự để giải quyết các vấn đề. Theo nguyên lý này, khi có nhiều phiên bản của một chơng trình chạy cùng một lúc thì một dữ liệu nào đó đã bị sửa đổi và khi nó đợc chuyển tới các phiên bản khác nhau thì có thể có những giá trị khác nhau.
Nếu xây dựng nhiều trang Web, trong đó thông tin trên một trang này có thể tác động tới các trang khác thì việc thiết kế để tránh trùng hợp dữ liệu ở cùng một trang mà tại nhiều phiên bản có giá trị khác nhau là một việc tơng đối khó, trừ phi phải tiến hành những thao tác đặc biệt để giải quyết vấn đề này. Mỗi một trang Web khi bị truy xuất sẽ tạo ra một hành động gọi chơng trình CGI mới, thì thao tác đặc biệt phải báo cho chơng trình CGI biết đợc những vấn đề gì đã xảy ra khi nó đọc gọi ở lần trớc đó. Một trong những thao tác đặc biệt đó thờng đợc sử dụng là lu giữ những thông tin thay đổi vào file. Nhng giải pháp này vẫn bị hạn chế khi có nhiều client gọi chơng trình CGI cùng một lúc. Một cách khác là sử dụng trờng input có thuộc tính ẩn trong HTML để lu giữ các thay đổi. Nhng
cách này có một vấn đề ở chỗ: từng thông tin lu trong trờng input có thuộc tính ẩn không hiện lên trên browser nhng client vẫn có thể biết đợc khi sử dụng chức