-
CGI :: ข้อมูล - ข้อมูลเกี่ยวกับสภาพแวดล้อม CGI
เวอร์ชัน 0.86
โปรแกรม Perl บ่อยเกินไปมีข้อมูลเช่นชื่อของสคริปต์ที่ส่งรหัสเข้าสู่แหล่งที่มาของพวกเขา โดยทั่วไปแล้วการเข้ารหัสแบบแข็งเป็นสไตล์ที่ไม่ดีเนื่องจากสามารถทำให้โปรแกรมอ่านยากและลดความสามารถในการอ่านและพกพาได้ CGI :: ข้อมูลพยายามลบออก
นอกจากนี้เพื่อช่วยในการดีบักสคริปต์ CGI :: ข้อมูลพยายามทำสิ่งที่สมเหตุสมผลเมื่อคุณไม่ได้ใช้โปรแกรมในสภาพแวดล้อม CGI
CGI :: Info ยังมีไฟร์วอลล์แอปพลิเคชันเว็บอย่างง่าย ในขณะที่คุณไม่ควรพึ่งพามันเพียงอย่างเดียวเพื่อให้ความปลอดภัยแก่เว็บไซต์ของคุณมันเป็นอีกเลเยอร์และทุกความช่วยเหลือเล็ก ๆ น้อย ๆ
use CGI::Info;
my $info = CGI::Info->new();
# ...
สร้างวัตถุ CGI :: INFO
ต้องใช้อาร์กิวเมนต์ตัวเลือกสี่ข้ออนุญาต, logger, คาดหวังและ upload_dir ซึ่งมีการบันทึกไว้ในวิธี params ()
ใช้พารามิเตอร์เสริม syslog เพื่อบันทึกข้อความไปยัง sys :: syslog มันอาจเป็นบูลีนที่จะเปิด/ปิดการใช้งานการบันทึกไปยัง syslog หรืออ้างอิงถึงแฮชที่จะมอบให้กับ sys :: syslog :: setlogsock
ใช้ตัวบันทึกพารามิเตอร์เสริมวัตถุที่ใช้สำหรับคำเตือน
ใช้แคชพารามิเตอร์เสริมวัตถุที่ใช้ในการค้นหาการค้นหา IP วัตถุแคชนี้เป็นวัตถุที่เข้าใจ GET () และ SET () ข้อความเช่นวัตถุ CHI
ใช้พารามิเตอร์เสริม MAX_UPLOAD ซึ่งเป็นขนาดไฟล์สูงสุดที่คุณสามารถอัปโหลด (-1 โดยไม่ จำกัด ) ค่าเริ่มต้นคือ 512MB
ส่งคืนชื่อของสคริปต์ CGI สิ่งนี้มีประโยชน์สำหรับการโพสต์ดังนั้นจึงหลีกเลี่ยงการวางเส้นทางฮาร์ดโค้ดลงในรูปแบบ
use CGI::Info;
my $info = CGI::Info->new();
my $script_name = $info->script_name();
# ...
print "<form method="POST" action=$script_name name="my_form">n";
ค้นหาชื่อเส้นทางเต็มของสคริปต์
use CGI::Info;
my $info = CGI::Info->new();
my $fullname = $info->script_path();
my @statb = stat($fullname);
if(@statb) {
my $mtime = localtime $statb[9];
print "Last-Modified: $mtimen";
# TODO: only for HTTP/1.1 connections
# $etag = Digest::MD5::md5_hex($html);
printf "ETag: "%x"n", $statb[9];
}
ส่งคืนไดเรกทอรีระบบไฟล์ที่มีสคริปต์
use CGI::Info;
use File::Spec;
my $info = CGI::Info->new();
print 'HTML files are normally stored in ', $info->script_dir(), '/', File::Spec->updir(), "n";
# or
use lib CGI::Info::script_dir() . '../lib';
ส่งคืนชื่อโฮสต์ของเว็บเซิร์ฟเวอร์ปัจจุบันตาม CGI หากไม่สามารถกำหนดชื่อได้จากเว็บเซิร์ฟเวอร์ชื่อโฮสต์ของระบบจะถูกใช้เป็นถอยกลับ สิ่งนี้อาจไม่เหมือนกับเครื่องที่สคริปต์ CGI กำลังทำงานอยู่ ISP และไซต์อื่น ๆ ที่ใช้สคริปต์บนเครื่องจักรที่แตกต่างจากที่ส่งเนื้อหาแบบคงที่ มีโอกาสที่ดีที่จะเป็น domain_name () ล่วงหน้าด้วย 'www' หรือ 'cgi'
use CGI::Info;
my $info = CGI::Info->new();
my $host_name = $info->host_name();
my $protocol = $info->protocol();
# ...
print "Thank you for visiting our <A HREF="$protocol://$host_name">Website!</A>";
domain_name เป็นชื่อของโดเมนควบคุมสำหรับเว็บไซต์นี้ โดยปกติแล้วมันจะคล้ายกับ host_name แต่จะขาดคำนำหน้า http: // หรือ www
ส่งคืน URL ของเครื่องที่ใช้สคริปต์ CGI
ส่งคืนการอ้างอิงไปยังรายการแฮชของอาร์กิวเมนต์ CGI
CGI :: ข้อมูลช่วยให้คุณทดสอบสคริปต์ของคุณก่อนการปรับใช้บนเว็บไซต์: หากไม่ได้อยู่ในสภาพแวดล้อม CGI (เช่นสคริปต์กำลังถูกทดสอบจากบรรทัดคำสั่ง) ข้อโต้แย้งบรรทัดคำสั่งของโปรแกรม (รายการของคู่คีย์ = ค่า) จะถูกใช้หากไม่มีข้อโต้แย้งบรรทัดคำสั่ง นอกจากนี้คุณยังสามารถให้หนึ่งใน-Tablet,-การค้นหา engine,-mobile และ-robot เพื่อเลียนแบบตัวแทนเหล่านั้น ตัวอย่างเช่น:
./script.cgi --mobile name=Nigel
ส่งคืน undef หากไม่สามารถกำหนดพารามิเตอร์หรือไม่ได้รับ
หากมีการโต้แย้งสองครั้งหรือมากกว่านั้นค่าจะถูกใส่ในสตริงคั่นด้วยเครื่องหมายจุลภาค
ค่าแฮชที่ส่งคืนสามารถส่งผ่านไปยัง CGI :: ไม่ได้
ใช้พารามิเตอร์เสริมสี่พารามิเตอร์: อนุญาต, คาดหวัง, logger และ upload_dir พารามิเตอร์จะถูกส่งผ่านในแฮชหรืออ้างอิงถึงแฮช หลังมีประสิทธิภาพมากขึ้นเนื่องจากมันน้อยลงบนสแต็ก
อนุญาตคือการอ้างอิงถึงรายการแฮชของพารามิเตอร์ CGI ที่คุณจะอนุญาต ค่าสำหรับแต่ละรายการเป็นนิพจน์ปกติของค่าที่อนุญาตสำหรับคีย์ ค่า undef หมายความว่าจะอนุญาตให้มีค่าใด ๆ อาร์กิวเมนต์ที่ไม่ได้อยู่ในรายการจะถูกละเว้นอย่างเงียบ ๆ สิ่งนี้มีประโยชน์ในการช่วยบล็อกการโจมตีบนเว็บไซต์ของคุณ
คาดว่าจะเป็นการอ้างอิงถึงรายการอาร์กิวเมนต์ที่คุณคาดว่าจะเห็นและส่งต่อ อาร์กิวเมนต์ที่ไม่ได้อยู่ในรายการจะถูกละเว้นอย่างเงียบ ๆ สิ่งนี้มีประโยชน์ในการช่วยบล็อกการโจมตีบนเว็บไซต์ของคุณ การใช้งานของมันเลิกใช้งานอนุญาตให้ใช้แทน คาดว่าจะถูกลบออกในเวอร์ชันใหม่
upload_dir เป็นสตริงที่มีไดเรกทอรีที่จะเก็บไฟล์ไว้
ใช้ตัวบันทึกพารามิเตอร์เสริมวัตถุที่ใช้สำหรับคำเตือนและร่องรอย วัตถุ Logger นี้เป็นวัตถุที่เข้าใจข้อความ Warn () และ Trace () เช่นบันทึก :: log4perl หรือ log :: วัตถุใด ๆ
อาร์กิวเมนต์อนุญาตคาดหวัง, logger และ upload_dir สามารถส่งผ่านไปยังตัวสร้าง
use CGI::Info;
use CGI::Untaint;
# ...
my $info = CGI::Info->new();
my %params;
if($info->params()) {
%params = %{$info->params()};
}
# ...
foreach(keys %params) {
print "$_ => $params{$_}n";
}
my $u = CGI::Untaint->new(%params);
use CGI::Info;
use CGI::IDS;
# ...
my $info = CGI::Info->new();
my $allowed = {
foo => qr/^d*$/, # foo must be a number, or empty
bar => undef, # bar can be given and be any value
xyzzy => qr/^[ws-]+$/, # must be alphanumeric
# to prevent XSS, and non-empty
# as a sanity check
};
my $paramsref = $info->params(allow => $allowed);
# or
my @expected = ('foo', 'bar');
my $paramsref = $info->params({
expect => @expected,
upload_dir = $info->tmpdir()
});
if(defined($paramsref)) {
my $ids = CGI::IDS->new();
$ids->set_scan_keys(scan_keys => 1);
if($ids->detect_attacks(request => $paramsref) > 0) {
die 'horribly';
}
}
หากคำขอเป็นคำขอ XML (เช่นประเภทเนื้อหาของโพสต์คือข้อความ/xml), cgi :: info จะนำคำขอลงในองค์ประกอบ params 'xml' ดังนั้น:
use CGI::Info;
# ...
my $info = CGI::Info->new();
my $paramsref = $info->params(); # See BUGS below
my $xml = $$paramsref{'XML'};
# ... parse and process the XML request in $xml
รับพารามิเตอร์เดียว ใช้พารามิเตอร์สตริงเดี่ยวที่เป็นตัวเลือกซึ่งเป็นอาร์กิวเมนต์ที่จะส่งคืน หากพารามิเตอร์นั้นไม่ได้รับ param () เป็น wrapper to params () ที่ไม่มีอาร์กิวเมนต์
use CGI::Info;
# ...
my $info = CGI::Info->new();
my $bar = $info->param('foo');
หากพารามิเตอร์ที่ร้องขอไม่ได้อยู่ในรายการที่อนุญาตข้อความแสดงข้อผิดพลาดจะถูกโยน:
use CGI::Info;
my $allowed = {
foo => qr/d+/
};
my $xyzzy = $info->params(allow => $allowed);
my $bar = $info->param('bar'); # Gives an error message
ส่งคืน Undef หากไม่ได้รับพารามิเตอร์ที่ร้องขอ
ส่งคืนบูลีนหากเว็บไซต์กำลังดูบนอุปกรณ์มือถือเช่นสมาร์ทโฟน แท็บเล็ตทั้งหมดเป็นมือถือ แต่ไม่ใช่อุปกรณ์มือถือทั้งหมดที่เป็นแท็บเล็ต
ส่งคืนบูลีนหากเว็บไซต์กำลังดูบนแท็บเล็ตเช่น iPad
ส่งคืนพารามิเตอร์เป็นสตริงซึ่งมีประโยชน์สำหรับการดีบักหรือสร้างคีย์สำหรับแคช
ส่งคืนโปรโตคอลการเชื่อมต่อน่าจะเป็น 'HTTP' หรือ 'HTTPS' หรือ undef หากไม่สามารถกำหนดได้
ส่งคืนชื่อของไดเรกทอรีที่คุณสามารถใช้เพื่อสร้างไฟล์ชั่วคราวใน
รูทีนนั้นดีกว่า "tmpdir" ในไฟล์ :: ข้อมูลจำเพาะเนื่องจากโปรแกรม CGI มักจะทำงานบนเซิร์ฟเวอร์ที่ใช้ร่วมกัน ต้องบอกว่า tmpdir จะกลับไปที่ไฟล์ :: spec-> tmpdir () หากไม่สามารถหาที่ไหนสักแห่งได้ดีกว่า
หากมีการกำหนดพารามิเตอร์ 'เริ่มต้น' ให้ใช้ไดเรกทอรีนั้นเป็นการตกกลับมากกว่าค่าในไฟล์ :: Spec-> tmpdir () ไม่มีการทดสอบด้านสติดังนั้นหากคุณให้ค่าเริ่มต้นของ '/ไม่มีอยู่' นั่นจะถูกส่งคืน
TMPDIR อนุญาตให้มีการอ้างอิงของตัวเลือกที่จะผ่าน
use CGI::Info;
my $info = CGI::Info->new();
my $dir = $info->tmpdir(default => '/var/tmp');
$dir = $info->tmpdir({ default => '/var/tmp' });
# or
my $dir = CGI::Info->tmpdir();
ส่งคืนรูทเอกสาร สิ่งนี้ควรดู Document_root ในสภาพแวดล้อมเพราะมันจะทำงานได้เมื่อเราไม่ได้ทำงานเป็นสคริปต์ CGI ซึ่งมีประโยชน์สำหรับการดีบักสคริปต์
สิ่งนี้สามารถเรียกใช้เป็นคลาสหรือวิธีการวัตถุ
use CGI::Info;
print CGI::Info->rootdir();
คำพ้องความหมายของ rootdir () เพื่อความเข้ากันได้กับ Chi
คำพ้องความหมายของ rootdir () เพื่อความเข้ากันได้กับ Apache
รับและตั้งค่าชื่อของไดเรกทอรีที่คุณสามารถใช้ในการจัดเก็บการเข้าสู่ระบบ
ผู้เข้าชมเป็นคนจริงหรือหุ่นยนต์?
use CGI::Info;
my $info = CGI::Info->new();
unless($info->is_robot()) {
# update site visitor statistics
}
ผู้เยี่ยมชมเป็นเครื่องมือค้นหาหรือไม่?
use CGI::Info;
if(CGI::Info->new()->is_search_engine()) {
# display generic information about yourself
} else {
# allow the user to pick and choose something to display
}
ส่งคืนหนึ่งใน 'เว็บ', 'ค้นหา', 'หุ่นยนต์' และ 'มือถือ'
# Code to display a different web page for a browser, search engine and
# smartphone
use Template;
use CGI::Info;
my $info = CGI::Info->new();
my $dir = $info->rootdir() . '/templates/' . $info->browser_type();
my $filename = ref($self);
$filename =~ s/::///g;
$filename = "$dir/$filename.tmpl";
if((!-f $filename) || (!-r $filename)) {
die "Can't open $filename";
}
my $template = Template->new();
$template->process($filename, {}) || die $template->error();
ส่งคืนค่าของคุกกี้หรือ undef หากไม่มีชื่อหรือคุกกี้ที่ร้องขอไม่ได้อยู่ในขวด
เลิกใช้แล้ว - ใช้คุกกี้ () แทน
use CGI::Info;
my $i = CGI::Info->new();
my $name = $i->get_cookie(cookie_name => 'name');
print "Your name is $namen";
my $address = $i->get_cookie('address');
print "Your address is $addressn";
ส่งคืนค่าของคุกกี้หรือ undef หากไม่มีชื่อหรือคุกกี้ที่ร้องขอไม่ได้อยู่ในขวด API เหมือนกับ "param" มันจะแทนที่วิธี "get_cookie" ในอนาคต
use CGI::Info;
my $name = CGI::Info->new()->cookie('name');
print "Your name is $namen";
ตั้งค่าหรือส่งคืนสถานะของวัตถุ 200 สำหรับ OK มิฉะนั้นรหัสข้อผิดพลาด HTTP
ส่งคืนคำเตือนว่าวัตถุได้สร้างขึ้น
บางครั้งคุณไม่รู้ว่าตัวบันทึกคืออะไรจนกว่าคุณจะได้สร้างอินสแตนซ์คลาส ฟังก์ชั่นนี้แก้ไขสถานการณ์ catch22
วิธีการเรียนเพื่อรีเซ็ตคลาส คุณควรทำสิ่งนี้ในสภาพแวดล้อม FCGI ก่อนที่จะสร้างอินสแตนซ์ แต่ไม่มีที่อื่น
Nigel Horne, <njh at bandsman.co.uk>
IS_TABLET () จะตรวจพบพีซี iPad และ Windows เท่านั้น สตริง Android ไม่แตกต่างกันระหว่างแท็บเล็ตและสมาร์ทโฟน
โปรดรายงานข้อบกพร่องหรือการร้องขอคุณสมบัติใด ๆ ไปยัง bug-cgi-info at rt.cpan.org หรือผ่านเว็บอินเตอร์เฟสที่ http://rt.cpan.org/noauth/reportbug.html?queue=cgi-info ฉันจะได้รับแจ้งจากนั้นคุณจะได้รับแจ้งความคืบหน้าโดยอัตโนมัติเกี่ยวกับข้อผิดพลาดของคุณเมื่อฉันทำการเปลี่ยนแปลง
params () ส่งคืนการอ้างอิงซึ่งหมายความว่าการเรียกรูทีนสามารถเปลี่ยนแฮชสำหรับรูทีนอื่น ๆ ใช้สำเนาท้องถิ่นก่อนทำการแก้ไขตารางหากคุณไม่ต้องการให้สิ่งที่ไม่คาดคิดเกิดขึ้น
http :: browserdetect, https://github.com/mitchellkrogza/apache-ultimate-bad-bot-bot-locker
คุณสามารถค้นหาเอกสารสำหรับโมดูลนี้ด้วยคำสั่ง PERLDOC
perldoc CGI::Info
คุณสามารถค้นหาข้อมูลได้ที่:
อภิปรัชญา
https://metacpan.org/dist/cgi-info
RT: ติดตามคำขอของ CPAN
https://rt.cpan.org/noauth/bugs.html?dist=cgi-info
เมทริกซ์ของผู้ทดสอบ CPAN
http://matrix.cpantesters.org/?dist=cgi-info
การพึ่งพาผู้ทดสอบ CPAN
http://deps.cpantesters.org/?module=cgi::info
ลิขสิทธิ์ 2010-2024 Nigel Horne
โปรแกรมนี้เปิดตัวภายใต้ใบอนุญาตต่อไปนี้: GPL2