Latest web development tutorials

Perl CGI Programming

Apa CGI

CGI saat ini dikelola oleh NCSA, NCSA CGI didefinisikan sebagai berikut:

CGI (Common Gateway Interface), Common Gateway Interface, yang merupakan program yang berjalan di server, seperti: HTTP server, antarmuka klien menyediakan halaman HTML yang sama.


web browsing

Untuk lebih memahami bagaimana CGI bekerja, kita bisa klik pada link pada halaman web atau URL dari proses:

  • 1, menggunakan browser untuk mengakses URL dan terhubung ke web server HTTP.
  • 2, Web server menerima pesan permintaan akan diurai URL dan mencari file diakses pada server jika ada, jika ada untuk mengembalikan isi file, jika tidak maka kembali pesan kesalahan.
  • 3, browser menerima informasi dari server dan menampilkan diterima file atau pesan kesalahan.

program CGI bisa menjadi script Python, naskah PERL, naskah SHELL, C atau C ++ program.


CGI Bagan

cgiarch


konfigurasi server web dan dukungan

Sebelum Anda melakukan pemrograman CGI, pastikan bahwa server Web Anda telah dikonfigurasi untuk mendukung CGI dan CGI handler.

Apache mendukung konfigurasi CGI:

Mengatur direktori CGI:

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

Semua HTTP server untuk mengeksekusi program CGI disimpan dalam direktori pra-dikonfigurasi. Direktori ini disebut direktori CGI, dan dengan konvensi, itu bernama / var / www / direktori cgi-bin.

File CGI ekstensi cgi, Perl juga dapat menggunakan ekstensi .pl.

Secara default, Linux server konfigurasi menjalankan direktori cgi-bin adalah / var / www.

Jika Anda ingin menentukan direktori yang berbeda untuk menjalankan script CGI, Anda dapat memodifikasi file konfigurasi httpd.conf sebagai berikut:

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options +ExecCGI
   Order allow,deny
   Allow from all
</Directory>

Menambahkan akhiran .pl AddHandler, sehingga kita dapat mengakses akhir .pl file script Perl:

AddHandler cgi-script .cgi .pl .py

Program CGI pertama

Di bawah ini kami membuat file test.cgi, kode tersebut adalah sebagai berikut:

#!/usr/bin/perl

print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! </h2>';
print '<p>来自本教程第一个 CGI 程序。</p>';
print '</body>';
print '</html>';

1;

Kemudian buka browser Anda ke http: //localhost/cgi-bin/test.cgi, hasil output adalah sebagai berikut:

Output dari baris pertama dari script "Content-type: text / html \ r \ n \ r \ n" dikirim ke browser dan memberitahu browser untuk menampilkan jenis konten "text / html".


HTTP header

isi file test.cgi di: bagian dari header HTTP adalah "Content-type text / html", itu akan dikirim ke jenis konten browser menceritakan file browser.

Format Header HTTP adalah sebagai berikut:

HTTP 字段名: 字段内容

Sebagai contoh:

Content-type:text/html\r\n\r\n

Tabel berikut menjelaskan informasi dalam program CGI HTTP header yang sering digunakan:

kepala deskripsi
Konten-type: entitas MIME sesuai dengan permintaan informasi. Sebagai contoh: Content-type: text / html
Kedaluwarsa: Tanggal Tanggal respon dan waktu berakhir
Lokasi: URL Untuk mengarahkan penerima untuk permintaan URL non-lokasi untuk menyelesaikan permintaan atau identifikasi sumber daya baru
Terakhir diubah: Tanggal sumber daya yang diminta terakhir diubah
Konten-length: N permintaan konten-Panjang
Set-Cookie: String pengaturan http Cookie

Variabel CGI Lingkungan

Semua program CGI telah menerima variabel lingkungan berikut, yang memainkan peran penting dalam program CGI:

nama variabel deskripsi
CONTENT_TYPE Nilai ini menunjukkan bahwa variabel lingkungan dengan jenis MIME transfer informasi. Saat ini, variabel lingkungan umumnya CONTENT_TYPE: application / x-www-form-urlencoded, ia mengatakan bahwa data dari bentuk HTML.
CONTENT_LENGTH Jika modus transfer server dan program CGI informasi adalah POST, bahkan jika variabel lingkungan STDIN masukan jumlah byte yang dapat membaca data yang valid dari standar. variabel lingkungan ini ketika membaca data input harus digunakan.
HTTP_COOKIE konten COOKIE dalam klien.
HTTP_USER_AGENT Memberikan informasi termasuk nomor versi dari browser klien atau data kepemilikan lainnya.
PATH_INFO Nilai variabel lingkungan ini menunjukkan nama program CGI segera setelah informasi jalur tambahan. Ini sering muncul sebagai program argumen CGI.
QUERY_STRING Jika modus transfer server dan program CGI informasi adalah informasi GET, nilai variabel lingkungan ini bahkan jika berlalu. Informasi ini diikuti dengan nama program CGI, baik di tengah-tengah dengan tanda tanya '?' Separator.
REMOTE_ADDR Nilai variabel lingkungan ini adalah alamat IP dari klien mengirimkan permintaan, misalnya, 192.168.1.67 atas. Nilai ini selalu hadir. Dan itu adalah kebutuhan untuk menyediakan Web klien untuk identifier unik server Web dapat digunakan dalam program-program CGI untuk membedakan antara klien Web yang berbeda.
REMOTE_HOST Nilai variabel lingkungan ini berisi nama host dari klien meminta CGI. Jika tidak Anda ingin memeriksa, Anda tidak perlu mendefinisikan variabel lingkungan ini.
REQUEST_METHOD Ini menyediakan metode yang disebut skrip. Untuk HTTP script / 1.0 protokol hanya GET dan POST bermakna.
SCRIPT_FILENAME Path lengkap ke skrip CGI
SCRIPT_NAME Nama script CGI
SERVER_NAME Ini adalah nama host, alias, atau alamat IP dari server WEB Anda.
SERVER_SOFTWARE Nilai variabel lingkungan ini berisi panggilan CGI nama program dan versi jumlah server HTTP. Misalnya, nilai di atas Apache / 2.2.14 (Unix)

Berikut ini adalah script CGI variabel lingkungan keluaran CGI sederhana:

#!/usr/bin/perl

print "Content-type: text/html\n\n";
print '<meta charset="utf-8">';
print "<font size=+1>环境变量:</font>\n";
foreach (sort keys %ENV)
{
  print "<b>$_</b>: $ENV{$_}<br>\n";
}

1;

download

Jika kita ingin mencapai melalui Perl download file CGI, memerlukan set yang berbeda dari informasi header sebagai berikut:

#!/usr/bin/perl

# HTTP Header
print "Content-Type:application/octet-stream; name=\"FileName\"\r\n";
print "Content-Disposition: attachment; filename=\"FileName\"\r\n\n";

# Actual File Content will go hear.
open( FILE, "<FileName" );
while(read(FILE, $buffer, 100) )
{
   print("$buffer");
}

Gunakan metode GET mentransfer data

GET metode untuk mengirimkan informasi pengguna dikodekan ke server, data informasi yang terkandung dalam URL dari permintaan halaman ke nomor dibagi sebagai berikut "?":

http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2
GET permintaan tentang beberapa komentar lain:
  • GET permintaan dapat di-cache
  • permintaan GET tetap dalam riwayat browser
  • GET permintaan dapat di-bookmark
  • GET permintaan tidak harus digunakan ketika berhadapan dengan data sensitif
  • GET permintaan memiliki batasan panjang
  • GET permintaan hanya harus digunakan untuk mengambil data

Contoh url sederhana: metode GET

Berikut ini adalah URL sederhana, menggunakan metode GET untuk mengirimkan dua parameter program test.cgi:

/cgi-bin/test.cgi?name=本教程&url=http://www.w3big.com

Sebuah file kode test.cgi:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取文本信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "GET")
{
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$name = $FORM{name};
$url  = $FORM{url};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>$name网址:$url</h2>";
print "</body>";
print "</html>";

1;

Periksa browser Anda, hasil output adalah sebagai berikut:

Contoh bentuk sederhana: metode GET

Berikut ini adalah dua mengirim data ke server menggunakan metode GET melalui form HTML, diserahkan dokumen test.cgi skrip server yang sama, kode test.html adalah sebagai berikut:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="get">
站点名称: <input type="text" name="name">  <br />

站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

pelaksanaan browser hasil adalah sebagai berikut:


Menggunakan metode POST untuk melewatkan data

Menggunakan metode POST untuk melewatkan data ke server yang lebih aman dan dapat diandalkan, karena beberapa informasi sensitif seperti password pengguna harus menggunakan POST untuk mentransfer data.

Berikut ini juga test.cgi, juga dapat menangani data formulir POST disampaikan oleh browser:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取文本信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$name = $FORM{name};
$url  = $FORM{url};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>$name网址:$url</h2>";
print "</body>";
print "</html>";

1;

Berikut ini adalah dua mengirim data ke server menggunakan metode GET melalui form HTML, diserahkan dokumen test.cgi skrip server yang sama, kode test.html adalah sebagai berikut:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post">
站点名称: <input type="text" name="name">  <br />

站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

pelaksanaan browser hasil adalah sebagai berikut:

program CGI untuk melewatkan data melalui kotak centang

checkbox digunakan untuk mengirimkan satu atau lebih data pilihan, kode test.html adalah sebagai berikut:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="POST" target="_blank">
<input type="checkbox" name="w3big" value="on" /> 本教程
<input type="checkbox" name="google" value="on" /> Google
<input type="submit" value="选择站点" />
</form>
</body>
</html>

Sebuah file kode test.cgi:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
if( $FORM{w3big} ){
   $w3big_flag ="ON";
}else{
   $w3big_flag ="OFF";
}
if( $FORM{google} ){
   $google_flag ="ON";
}else{
   $google_flag ="OFF";
}

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2> 本教程选中状态 : $w3big_flag</h2>";
print "<h2> Google 选择状态 : $google_flag</h2>";
print "</body>";
print "</html>";

1;

pelaksanaan browser hasil adalah sebagai berikut:


Radio transfer data via program CGI

Radio hanya mentransfer data ke server, kode test.html adalah sebagai berikut:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post" target="_blank">
<input type="radio" name="site" value="w3big" /> 本教程
<input type="radio" name="site" value="google" /> Google
<input type="submit" value="提交" />
</form>
</body>
</html>

kode script test.cgi adalah sebagai berikut:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$site = $FORM{site};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2> 选择的网站 $site</h2>";
print "</body>";
print "</html>";

1;

pelaksanaan browser hasil adalah sebagai berikut:


transfer data textarea melalui program CGI

Textarea lulus beberapa baris data ke server, kode test.html adalah sebagai berikut:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post" target="_blank">
<textarea name="textcontent" cols="40" rows="4">
在这里输入内容...
</textarea>
<input type="submit" value="提交" />
</form>
</body>
</html>

kode script test.cgi adalah sebagai berikut:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$text_content = $FORM{textcontent};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>输入的文本内容为:$text_content</h2>";
print "</body>";
print "</html>";

1;

pelaksanaan browser hasil adalah sebagai berikut:


program CGI untuk melewatkan data melalui pull-down

HTML kode kotak drop-down sebagai berikut:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/test.cgi" method="post" target="_blank">
<select name="dropdown">
<option value="w3big" selected>本教程</option>
<option value="google">Google</option>
</select>
<input type="submit" value="提交"/>
</form>
</body>
</html>

kode script test.cgi sebagai berikut:

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# 读取信息
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST")
{
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# 读取 name/value 对信息
@pairs = split(/&/, $buffer);
foreach $pair (@pairs)
{
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$site = $FORM{dropdown};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print '<meta charset="utf-8">';
print '<title>本教程(w3big.com)</title>';
print "</head>";
print "<body>";
print "<h2>选择的网站是:$site</h2>";
print "</body>";
print "</html>";

1;

pelaksanaan browser hasil adalah sebagai berikut:


CGI digunakan Cookie

protokol http dalam kelemahan besar yang salah untuk menilai identitas pengguna, yang memberikan programmer banyak ketidaknyamanan, tetapi tampaknya fungsi cookie yang dibuat untuk kekurangan ini.

cookie yang mengakses script sedangkan pelanggan melalui browser pelanggan pada hard disk klien untuk menulis catatan data, mengambil data ketika pelanggan mengunjungi script berikutnya, sehingga mencapai fungsi menentukan identitas, kue yang biasa digunakan dalam memverifikasi identitas.

sintaks Cookie

Cookie http dikirim melalui header http untuk mencapai, ia harus mentransfer file, sintaks sundulan set-Cookie adalah sebagai berikut:

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • name = Nama: untuk menetapkan nilai dari cookie (nama tidak dapat digunakan ";" dan "," nomor), ketika ada beberapa nilai nama ";" untuk memisahkan, misalnya: name1 = name1; name2 = name2 ; name3 = name3.
  • berakhir = date: Cookie tanggal kedaluwarsa dalam format: berakhir = "Wdy, DD- Mon-YYYY HH: MM: SS"
  • path = path: jalur mengatur dukungan cookie, jika jalan adalah jalan, cookie untuk semua file dan subdirektori dari direktori entri berlaku, misalnya: path = "/ cgi-bin /", jika jalan adalah sebuah file, kue Hal ini mengacu pada berlakunya file ini, misalnya: path = "/ cgi-bin / cookie.cgi".
  • domain = domain: nama domain cookie berlaku, misalnya: domain = "www.w3big.com"
  • mengamankan: Jika flag ini diberikan, bahwa cookie hanya dapat ditularkan melalui protokol SSL https Server.
  • Cookie diterima dengan menetapkan variabel lingkungan HTTP_COOKIE dicapai, program CGI dapat memperoleh informasi dengan mengambil variabel cookie.

pengaturan Cookie

pengaturan cookie sangat sederhana, kue akan dikirim secara terpisah di http header. Contoh berikut menetapkan UserID, Password dan berakhir di cookie:

#!/usr/bin/perl

print "Set-Cookie:UserID=XYZ;\n";
print "Set-Cookie:Password=XYZ123;\n";
print "Set-Cookie:Expires=Tuesday, 31-Dec-2017 23:12:40 GMT";\n";
print "Set-Cookie:Domain=www.w3big.com;\n";
print "Set-Cookie:Path=/perl;\n";
print "Content-type:text/html\r\n\r\n";
...........其他 HTML 内容

Cari Cookie

Cookie halaman pencarian informasi sangat sederhana, dalam CGI variabel lingkungan HTTP_COOKIE, format penyimpanan adalah sebagai berikut informasi Cookie disimpan:

#!/usr/bin/perl
$rcvd_cookies = $ENV{'HTTP_COOKIE'};
@cookies = split /;/, $rcvd_cookies;
foreach $cookie ( @cookies ){
   ($key, $val) = split(/=/, $cookie); # splits on the first =.
   $key =~ s/^\s+//;
   $val =~ s/^\s+//;
   $key =~ s/\s+$//;
   $val =~ s/\s+$//;
   if( $key eq "UserID" ){
      $user_id = $val;
   }elsif($key eq "Password"){
      $password = $val;
   }
}
print "User ID  = $user_id\n";
print "Password = $password\n";

Contoh di atas output:

User ID = XYZ
Password = XYZ123

modul CGI

Perl CGI menyediakan banyak built-in modul, digunakan dua berikut: