[LinuxFocus-icon]
�����  |  �����  |  ������  |  �����

������� | ������ | ������ | ��� LF
��� ������� �������� ��: English  Castellano  Deutsch  Francais  Nederlands  Portugues  Russian  Turkce  

[image of the authors]
����� Fr�d�ric Raynal, Christophe Blaess, Christophe Grenier
<pappy(_at_)users.sourceforge.net, ccb(_at_)club-internet.fr, grenier(_at_)nef.esiea.fr>

�� ������:

Christophe Blaess - ����������� ������� �� �����������. �� ���������� Linux � ������ ������� ����� ����� ������ �� ���� �������. �������� ������������ ��������� man �������, ����������� Linux Documentation Project.

Christophe Grenier - ������� 5 ����� � ESIEA, ��� �� ����� �������� ����������. �������� ���������� ������������ �������������.

Fr�d�ric Raynal ����� ��� ���������� Linux, ������ ��� �� �� ���������� ���������� �����, �� ���������� �� �������, �� MSG, �� �������� ���� �� �������� ... ������ ������� ���� � ��������.



������� �� �������:
Kolobynin Alexey <alexey_ak0(_at_)mail.ru>

����������:

 

��� �������� ��� � ������������ ��� ���������� ���������� - ����� 6: CGI �������

[article illustration]

������:

�������� ����������� ����, ������� ������������ ����� ����� ���������� Perl ������ ... "���������� ����� ������ ������� ��� �������!"

���������� ������ �� �����:


_________________ _________________ _________________

 

���-������, URI � �������� ������������

 

(������ ��������) �������� � ��, ��� �������� ���-������ � ��� ��������� URI

����� ������ ����������� HTML ����, ������ �������� ��� ����������� �������� (��� ��������� �� ������). ������� ������������ HTML ���, ����� ��������������� � ���������� ����. ��������, ����� URL (Uniform Request Locator - ��������������� ��������� ��������������� �������) http://www.linuxdoc.org/HOWTO/HOWTO-INDEX/howtos.html,
������ ������������ � ������� www.linuxdoc.org � ����������� �������� /HOWTO/HOWTO-INDEX/howtos.html (����� ������ ���������� URI - Uniform Resource Identifiers (������������� ������������� �������)), ��������� �������� HTTP. ���� �������� ����������, ������ �������� ����������� ����. � ����� ����������� ������, ���� ���� ������������ �� �������, �� ���������� ������� ��� ����, ����� ���������� ��������� �� ������ (������ ��������� 404 - Not Found).

� ����������, ����� ������ �� ��������� ������������ ��������������� ��� ������ � �������������, ��� ������ ����������� ����� ����, ��� e-������, �-������������ (�������) �� ��������� � e-���_����_���.

� ������� ���� ������� ��� ����������� ������������ HTML ��������. CGI (Common Gateway Interface - ����� �������� ���������) ������� - ���� �� ���. � ���� ������ URI ��� ��������� ��� ������� �������� ������� ��-������� :

http://<������><������������>[?[�����_1=����_1][...] [&�����_n=����_n]]

������ ���������� ����������� � ���������� ��������� QUERY_STRING. � ������ ���������������, CGI ������ �� ����� ��� ����������� ����. �� ���������� stdin (����������� ����) ��� ���������� ��������� QUERY_STRING, ����� �������� ���������, ���������� ���. ����� ���������� ����, ��������� ��������� �� stdout (����������� �����) � �����, ���������� ���-�������. ����� ������ ���� ���������������� ����� ���� ����������� ��� ��������� CGI �������� (����������������� ��������� �� C, Perl, ������� shell � �.�.).

��� �������, ������� ������ � ����� HOWTO �� www.linuxdoc.org ����������� � ssh :

http://www.linuxdoc.org/cgi-bin/ldpsrch.cgi?svr=http%3A%2F%2Fwww.linuxdoc.org&srch=ssh&db=1&scope=0&rpt=20
����������, �� ��� ����� �������� ������� �����, ��� �������. �������������� ���� URL:

����� ����� ���������� � �� ��������, ���� ������������� ��� ���� ��� �������������. ����� ����, ���������� �������� � ������� ��� ����� �������� �� ����������.

������ �� ������, ��� ������ ������� CGI �������� - ����������� ������������ ���������� ������ ����� ���������... �� ������ ������� - �� ��� ����� ���������� ������ ��������� ���� � ������������.

�� �������� �������� �������� �������, ������� ���������� ��� ������� ������� � ���������� �������. ��� ������� ������������ � ���������� ������ ISO 8859-1 (��������� �� >man iso_8859_1). � ������� 1 ������������ �������� ��������� �� ���� �����. ��������, ��� � �������� IIS4.0 � IIS5.0 ���������� ������ ������� ����������, ���������� unicode bug, ���������� �� ������������� �������� "/" � "\" � unicode.

 

������������ Apache � "SSI Server Side Include"

Server Side Include - ������� �� ������� ������� - ���� �� ������������ ���-�������. ��� ��������� ��������� ���������� � ���-��������, ����� ��� ��������� � �������� ��������������� ����� ��� ���������� ������� (�������� ��� CGI �������).

� ����� ������������ Apache httpd.conf ���������� "AddHandler server-parsed .shtml" �������� ���� ��������. �����, ����� ������ �������� ����� .html � .shtml, � ���� ���������� ���������� ���������� .html. �����������, ��� ��������� ������ �������... ������ ��������� �������������� �� ������ ���������� ��� ������ ����������:


� �������������� � ����� ��������� ������� guestbook.cgi, �����, ��������������� �������������, ���������� � HTML ���� ��� ������ �������� '<' � ' >' �� HTML ��� &lt; � &gt;. �������������� ������� ����� �������� ���� �� ��������� ����������:

��� ������ ������,
guestbook.cgi?email=pappy&texte=%3c%21--%23printenv%20--%3e
�� �������� ��������� ����� � ����������� � �������:
DOCUMENT_ROOT=/home/web/sites/www8080
HTTP_ACCEPT=image/gif, image/jpeg, image/pjpeg, image/png, */*
HTTP_ACCEPT_CHARSET=iso-8859-1,*,utf-8
HTTP_ACCEPT_ENCODING=gzip
HTTP_ACCEPT_LANGUAGE=en, fr
HTTP_CONNECTION=Keep-Alive
HTTP_HOST=www.esiea.fr:8080
HTTP_PRAGMA=no-cache
HTTP_REFERER=http://www.esiea.fr:8080/~grenier/cgi/guestbook.cgi?
 email=&texte=%3C%21--%23include+file%3D%22guestbook.cgi%22--%3E
HTTP_USER_AGENT=Mozilla/4.76 [fr] (X11; U; Linux 2.2.16 i686)
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
REMOTE_ADDR=194.57.201.103
REMOTE_HOST=nef.esiea.fr
REMOTE_PORT=3672
SCRIPT_FILENAME=/mnt/c/nef/grenier/public_html/cgi/guestbook.html
SERVER_ADDR=194.57.201.103
[email protected]
SERVER_NAME=www.esiea.fr
SERVER_PORT=8080
SERVER_SIGNATURE=<ADDRESS>Apache/1.3.14 Server www.esiea.fr Port 8080</ADDRESS>

SERVER_SOFTWARE=Apache/1.3.14 (Unix)  (Red-Hat/Linux) PHP/3.0.18
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.0
REQUEST_METHOD=GET
QUERY_STRING=
REQUEST_URI=/~grenier/cgi/guestbook.html
SCRIPT_NAME=/~grenier/cgi/guestbook.html
DATE_LOCAL=Tuesday, 27-Feb-2001 15:33:56 CET
DATE_GMT=Tuesday, 27-Feb-2001 14:33:56 GMT
LAST_MODIFIED=Tuesday, 27-Feb-2001 15:28:05 CET
DOCUMENT_URI=/~grenier/cgi/guestbook.shtml
DOCUMENT_PATH_INFO=
USER_NAME=grenier
DOCUMENT_NAME=guestbook.shtml

���������� exec ������������� ��� ����� ��� ���������� shell:


guestbook.cgi?email=ppy&texte=%3c%21--%23exec%20cmd="cat%20/etc/passwd"%20--%3e

�� ����������� "<!--#include file="/etc/passwd"-->", ���� ������ ���������� ������������ ����������, ��� ���������� HTML ���� � �� ������ ��������� "..". ���� error_log Apache ����� ��������� ��������� � ������� ������� � ������������ �����. � ������������ ������ ������� ��������� [an error occurred while processing this directive(��� ��������� ���������� �������� ������)] �� HTML ��������.

SSI ����� ������ �����, ������� �� ����� ��������� �� �������. ������� ������������� �������� - ���������� ������������� ������� guestbook � SSI.

 

Perl �������

� ���� ��������� �� ���������� ���� � ������������, ����������� � CGI ��������, ���������� �� Perl. ��� �������� �� �� ����� ������ ������ ��� ��������, � ������ �����, ������� ���������� ��� ���������, ��� ��������� ��������.

������ �� ����� �������� �������� �� ���������� �������:

#!/usr/bin/perl -wT
BEGIN { $ENV{PATH} = '/usr/bin:/bin' }
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};   # ������� %ENV ���������� =:-)
print "Content-type: text/html\n\n";
print "<HTML>\n<HEAD>";
print "<TITLE>��������� �������</TITLE></HEAD>\n";
&ReadParse(\%input);
# ������ ����� ������������ $input, ��������, ���:
# print "<p>$input{filename}</p>\n";
# #################################### #
# ������ �������� ��������             #
# #################################### #



# ################################## #
# ����� �������� ��������            #
# ################################## #

form:
print "<form action=\"$ENV{'SCRIPT_NAME'}\">\n";
print "<input type=text name=filename>\n </form>\n";
print "</BODY>\n";
print "</HTML>\n";
exit(0);

# ������ �������� ������ ���� ������� �� ���.
# ��� ����� �������� �������.
sub ReadParse($) {
  my $in=shift;
  my ($i, $key, $val);
  my $in_first;
  my @in_second;

  # ���������� ������
  if ($ENV{'REQUEST_METHOD'} eq "GET") {
    $in_first = $ENV{'QUERY_STRING'};
  } elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN,$in_first,$ENV{'CONTENT_LENGTH'});
  }else{
    die "������: ����������� ����� �������\n";
  }

  @in_second = split(/&/,$in_first);

  foreach $i (0 .. $#in_second) {
    # ������ ������ ���������
    $in_second[$i] =~ s/\+/ /g;

    # ��������� �� ���� � ��������
    ($key, $val) = split(/=/,$in_second[$i],2);

    # ������� %XX �� ���������������� ����� � �������
    $key =~ s/%(..)/pack("c",hex($1))/ge;
    $val =~ s/%(..)/pack("c",hex($1))/ge;

    # ������������� ����� � ��������
    # \0 - ����������� ���������� ��������
    $$in{$key} .= "\0" if (defined($$in{$key}));
    $$in{$key} .= $val;

  }
  return length($#in_second);
}

��������� �� ����������, ���������� Perl (-wT), ��������� �������. �� �������� � ������� ���������� ��������� $ENV � $PATH � �������� HTML ��������� (��� ����� html ��������� ����� ��������� � ��������. �� �� ������ �� ������ �� ��������, ������������ � ��������). ������� ReadParse() ������ ���������, ���������� �������. ��� ����� ���� �� ����� ������� ��� ������ ������, ������ ��� �� �� ������� �� ���� ���. �����, �� ��������� ��� �������. � � ����� ��������� HTML ����.

 

������� ����

��� Perl ��� ������� ���������, ��� �������, ��������, �� ������� C. ��� Perl ������� ������ ����� ������ - ��� ����� �� ������ ��� � ��� ���������. � ���?

������� ������� ��������� ��� � ��� ������, ����� �������� showhtml.cgi  :

  # showhtml.cgi
  my $filename= $input{filename}.".html";
  print "<BODY>File : $filename<BR>";
  if (-e $filename) {
      open(FILE,"$filename") || goto form;
      print <FILE>;
  }


������� ReadParse() �������� ������ ���� ��������: ��� ����� ��� �����������. ����� �� ��������� ������ ������ �������� �� HTML ���������� "����������� �������", �� ��������� ���������� ".html" � ����� ����� �����. ������ �������, ��� ������� ���� - ��� ����� �� ������, ��� � ��� ���������...

�������, ���� ��� ������ showhtml.cgi?filename=%2Fetc%2Fpasswd%00, ���� ����� ���������� my $filename = "/etc/passwd\0.html" � ������ ����������� ����� ���������� ���-��� �� ���������� HTML.

��� ���������? ������� strace ����������, ��� Perl ��������� ����:

  /tmp >>cat >open.pl << EOF
  > #!/usr/bin/perl
  > open(FILE, "/etc/passwd\0.html");
  > EOF
  /tmp >>chmod 0700 open.pl
  /tmp >>strace ./open.pl 2>&1 | grep open
  execve("./open.pl", ["./open.pl"], [/* 24 vars */]) = 0
  ...
  open("./open.pl", O_RDONLY)             = 3
  read(3, "#!/usr/bin/perl\n\nopen(FILE, \"/et"..., 4096) = 51
  open("/etc/passwd", O_RDONLY)           = 3

��������� open(), ���������� strace, ������������� ���������� ������, ����������� �� C. �� ����� ������, ��� ���������� .html ��������, ��� ��������� ��� ������� /etc/passwd.

��� �������� �������� ��� ������ ������ ����������� ���������, ������� ������� ��� ������� �����:

s/\0//g;
 

������������� �������

��� ������, ���������� ��� ������ ������. �� ���������� �������� ���� �� ������ ��������� /home/httpd/:

#pipe1.cgi

my $filename= "/home/httpd/".$input{filename};
print "<BODY>File : $filename<BR>";
open(FILE,"$filename") || goto form;
print <FILE>;

�� �������� � ����� �������! � ����� �������� �������.

������ ������������� ��� ��������:

pipe1.cgi?filename=..%2F..%2F..%2Fetc%2Fpasswd
����� ������ �������� ����� �� ������, ����� �������� ������ � ������ �����. ������ ��� ���� ������ ����� ���������� �����������: ��������� ������� �� ������ ������. � Perl, ������� open(FILE, "/bin/ls") ��������� �������� ���� "/bin/ls"... ������ open(FILE, "/bin/ls |") ��������� ��������� �������. ���������� ������ ������� ������ |, �������� ��������� open().

������ �������� ��������� ��-�� ����, ��� �� ����������� ������������� �����, ��� ��������� ��� �� ������ ��������� ����� �������, �� � �������� �� ���������: pipe1.cgi?filename=..%2F..%2F..%2Fbin%2Fcat%20%2fetc%2fpasswd%20| ���������� ���������� ����� �������.

�������� �� ������������� ����� ��� ��������, ���� ������ �������:

#pipe2.cgi

my $filename= "/home/httpd/".$input{filename};
print "<BODY>File : $filename<BR>";
if (-e $filename) {
  open(FILE,"$filename") || goto form;
  print <FILE>
} else {
  print "-e failed: no file\n";
}

���������� ������ ������ �� ��������. �������� "-e" �� ��������, ��� ��� ���������� ����� ���� "../../../bin/cat /etc/passwd |".

��������� ������ ������� /bin/ls. ��������� ������� ����� ��� ��. �� ����, ���� �� ���������� ������� ������ ������ � ��������� /etc, "-e" �������� ������������� ����� "../../../bin/ls /etc |", ������ �� ����� �� ����������. ��� ��� �� �� ����� ������ ��� ������� �����, �� �� ������ �������� ������ ����������� :(

������ ��-�������� ���� "����� �� ���������", ���� ���� ��� ��������� �� ��� �� �����. ���� /bin/ls ���������� (�� ����������� ������), ������, ���� open() ������� � ���� ������ �����, ������� �� ����� ���������, � ����� ������� �������� ���. ������� �� ������ ����� ������ ��������� ����� '|' � ����� �����, �� ���, ����� �� �� ������������� ��� �������� "-e". �� ��� ����� ������� - ������� ����. ���� �� ������ "../../../bin/ls\0|" � �������� �����, �������� �� ������������� ������� �������, ��� ��� ��� �������� ������ "../../../bin/ls", ������ open() ����� ������ ����� � ������� �������� �������. �������, URI, ������� ��� ���� ���������� ������� ���������� �����:

pipe2.cgi?filename=../../../bin/ls%00|
 

������� ������

������ finger.cgi ��������� ���������� finger �� ����� ������:

#finger.cgi

print "<BODY>";
$login = $input{'login'};
$login =~ s/([;<>\*\|`&\$!#\(\)\[\]\{\}:'"])/\\$1/g;
print "Login $login<BR>\n";
print "Finger<BR>\n";
$CMD= "/usr/bin/finger $login|";
open(FILE,"$CMD") || goto form;
print <FILE>

���� ������ �� ������� ���� ������������� �������� ���� ����������������: �� ���������, ����� �������� ������� �� ���� ���������������� ���������, ������� '\' ����� ����. ����� �������, ����� � ������� ���������� �� "\;" ��� ������ ����������� ���������. ������ ������ �� �������� ��� ���������� �������. ����� ��� ��� �������� ������ '\n'.

� ��������� ������ ����� ������� �������� �� ������������� ����������, ������� ������� ����, ������� �������� ������ '\n'. � Perl �� ������ ������ �� �� �����. �� ��� ������, ��� ���������� open() ��������� ��� ��������� �������, ���� ������ ������������ �������� ������ '|'.

����� ������������� ����� ���������, �� ������� ������� ������� � ���������� ����� �����, ������� ���������� ������� finger:

finger.cgi?login=kmaster%0Acat%20/etc/passwd

������ �������, ������� ��������� ��������� ��������� ���������� � ����� ������:

��� ������� �� �������� � ������ �������, �.�. ��� �������������� ���������� ����������. ������, ������ ������ ������ ��� ��������.  

������� � ����� � �������

���������� ������ finger.cgi ������� ��������, ������� ����� ���������� � �������������� ��������� ��������. ����� �������, URI

finger.cgi?login=kmaster;cat%20/etc/passwd

�� ��������, ��� ��� ����� ������ � ������� �������� �������. ������, ���� ������ ����� ������� �� ������������� - ������� '\'.

������� � ������� ������, ������� �� ���� ��� ��������� �� ������ ��������� ��� ������ ����������� ��������� s/\.\.//g, ������� ������� "..". �� �����, ��� ���������! �������� ����� �������� � ����������� ������ ������� '/' (����� ��������� ������ ���������� cat ///etc//////passwd).

��������, � ������������� ������� pipe2.cgi ���������� $filename ���������������� ��� ������ �������� "/home/httpd/". ������������� ����������� ����������� ��������� ����� ���������� �����������, ����� �� ���� ����������� ��������� �� ����������� ������. ������� ��� ��������� ������� �� "..", ������ ��� ����� ���� �� �������� ������� ����� �������� '.'? ���������� ��������� �� ���������, ���� ��� ����� ����� .\./.\./etc/passwd. �������, ��� � ����� ������ ����� ��������� �������� ������� system() (��� ` ... `), �� open() � "-e" ���������� ������.

�������� � ������� finger.cgi. ����� finger.cgi?login=kmaster;cat%20/etc/passwd � �������������� ����� � ������� �� ���� ���������� ����������, ��� ��� ����� � ������� ������ ���� �������� ����� ������ ����������� ���������. �� ���� �������� �������� ����������:

/usr/bin/finger kmaster\;cat /etc/passwd
� ����� ���-������� ���������� ��������� ������:
finger: kmaster;cat: no such user.
finger: /etc/passwd: no such user.
��������� ��������� ���, ��� ��������, ���� �� ������� ��� ������� � ��������� ������. �������� �������� � ���, ��� ������� ����� ';' ���������� ������������� ���� ������ ��� ����� ������ "kmaster;cat".

�� �� ����� ��������� ��� ����������: ���� ��� �������, � ������ ��� ������ �������������. ��� ����� �� ������ ������� ��������� ������� ����� ';': <A HREF="finger.cgi?login=kmaster\;cat%20/etc/passwd"> finger.cgi?login=kmaster\;cat%20/etc/passwd</A>. ������ "\;" ���������� �������� �� "\\;", � ����� ���������� ��������. �������� �������� ������� :

/usr/bin/finger kmaster\\;cat /etc/passwd
� ��������� �� �� ��� ����������:
  1. /usr/bin/finger kmaster\, ������� ��������� ����� ������ �� ����... �� ��� ��� � �� ����� :-)
  2. cat /etc/passwd - ��� ������� ��� ���� � ��������.
������� ���� �������� �������: ���� � ���������� ��������� ������������ � ��� ������� '\'.

 

������������� ������������� ������� "

������ �������� "��������" �� �������������� ������������� ��� ������ �������. �� ������� ������ finger.cgi ���, ����� �������� ����� �������� ���������� $login.

������, ���� � ������� ����� ��������� �� �������� ��������, ���� ����� �� ���� ������. ���� �������, ����������� �� ������ �������, �������� ��� ����. ��� ���������, ������ ��� ������ ������� �� ������� ������� ����������� ������� �� �������. �����, �� ������ ������� �������, � ������ ������� �� ������� ������� ������, ������� ������� ������ ������� �� �������.

������ finger2.cgi ������������ ���:

#finger2.cgi

print "<BODY>";
$login = $input{'login'};
$login =~ s/\0//g;
$login =~ s/([<>\*\|`&\$!#\(\)\[\]\{\}:'\n])/\\$1/g;
print "Login $login<BR>\n";
print "Finger<BR>\n";
#����� (��)����������� �����-������:
$CMD= "/usr/bin/finger \"$login\"|";
open(FILE,"$CMD") || goto form;
while(<FILE>) {
  print;
}

URI ��� ���������� �����:

finger2.cgi?login=kmaster%22%3Bcat%20%2Fetc%2Fpasswd%3B%22
�������� ������� ������� /usr/bin/finger "$login";cat /etc/passwd;"", ������� �� �������� ��� ������� �������.

������� �����, ���� �� ������ ����������� ��������� ��� ������ �������, ������� �������� ����� ����, ����� ��� � ����� ������ � ������� � ���������, ��� �� ��������� �����.

 

���������������� �� Perl

 

����� warning � tainting

������������ �� Perl, ����������� ����� w ��� "use warnings;" (Perl 5.6.0 ��� �����), ��� ����������� ��� � ������������� ���������, ����� ��� �������������������� ���������� � ���������� ���������/�������.

����� T (taint mode) ������������� ����� ������� ������� ������������. ���� ����� ���������� ��������� ��������. ����� ������ �������� ���������� ����������� (tainting) ����������. ���������� ����� ���� ���� ������, ���� �������. ������ ����������� ����� ��������� ��������� �������� �� ��� ���, ���� ��� �� ����� �������. ������� ���������� �� ����� ���� ������������ ��� �������� ��������, ������� ����� �������������� �� ��������� ��������� (����� ������ ��������).

� ������ ������ ��������� ��������� ������, ���������� ���������, ���������� ��������� ��������� ������� (readdir(), readlink(), readdir(), ...) � ������ ���������� �� ������ ��������� ���������������, � �������, ��������.

����� �������� ���������� �� ������ ���������� �� ���������� ����������. ��������, ��� ������������� .* �� ���� ����������. ���� ������ ������� - ��������� ��� ���������� � ��������������� ����������. ������ ������������ ���������� ��������� ��� ����� ���� �� ���������.

��� �� ����� ���� ����� �� ���������� ��� �� ���� �������: �������������� ����������, ��������� system() ��� exec() ����� ����������-������, �� �����������. ������� �� ������ ���� ����� ���������, ���� ���� �� ����� �������� ���������� ��� �������. ���������� exec "sh", '-c', $arg; ��������� ���������� ��� ����������� �� ���� ������� ��� ��� ���������� $arg :(

����� ������������� ��������� "use strict;" � ������ ����� ���������. ��� �������� ��� ��������� ����������; ��������� ���� ������� ��� �����������, ������ ��� �����������, ���� �� ����������� mod-perl.

����� ������� CGI ������ �� Perl ������ ���������� �:

#!/usr/bin/perl -wT
use strict;
use CGI;
��� �� Perl 5.6.0 :
#!/usr/bin/perl -T
use warnings;
use strict;
use CGI;


 

����� open()

����� ������������� ��������� ���� ������ ��������� open(FILE,"$filename") || .... �� ��� ������ ��������� ������ ����. ����� �������� ����, ���������� ����� ��������:

�� ���������� ���� �����, �� �������� �����.

����� �������� � ����� ������������� ��������� ��� �������������. ��� �� ������� �� �������, ��������� � �������� ���������, �������� � ���������� ������, ������ ������� ������� ����� ������ � �����������.

if ( -e $filename ) { ... }

������� � Perl 5.6 �������� ����� ��������� ��� open() : open(�������� ����������,�����,������). � ������� '<' ���� ����������� ��� ������, � '>' - ���� ��������� ��� ��������� �� �������������, � ����� ����������� ��� ������. ���������� ����� ���������� ������ ��� ������� � ������� ����������. ���� ����� ������ ��� '|-' ��� '-|', �������� ������ ���������������� ��� �������, ������� ����������� ����� ��� �� ������� ������ ��������������.

�� Perl 5.6 � ��������������� ������� open() ��������� ���� ������������ ������� sysopen().

 

��������� � ���������� �������� ������

���� ��� ������: ���� �� ���������� ��� ������ ����������� ��������� ����������� �������, ���� �� ���� ����������� ���������� �������. ��������� �� �������� ������ ���� ��� �������, ��� ����� ����� ������ ������������� ������������ ������� �������, ������� ������ ����� ����������������.

�� �������� ��� ��� ���� �������: ��-������ ���������, ��� ������ �������� ������ ���������� �������. ����� ��������� �������� ����� ����������� ���������, ������� �������� ��������.

#!/usr/bin/perl -wT

# filtre.pl

#  ���������� $safe � $danger �������� �������, �������
#  �� ������������ � ������������ ���������, ��������������.
#  �������� ��� ������� �� ��� �������, ����� �������� ������ �������.
#  ������ � $input ��������� �������, ������ ���� ��� ������� ����������
#  ����� ����������.

use strict;

my $input = shift;

my $safe = '\w\d';
my $danger = '&`\'\\|"*?~<>^(){}\$\n\r\[\]';
#���������:
#  '/', ������ � ������ ��������� ���������� �� �������� � ������

if ($input =~ m/^[$safe$danger]+$/g) {
    $input =~ s/([$danger]+)/\\$1/g;
} else {
    die "������������ ������� � $input\n";
}
print "input = [$input]\n";


������ ���������� ��� ��������� ��������:

����� ������, ���������� ������, �� ������������� ����� ����������, ���������� �����������.

 

PHP �������

�� ���� ��������� ����������, ������ � ������, ��� ������� ����� ������ �� PHP, ��� �� Perl. ������, ��� ��������� �������������, � �����������, ����� ��� ������������ ������ ������� �� PHP, � �� �� Perl. ���� ���-���� ����� �� PHP, �� �������� � ������������, �� ����� ��� �� ������, ��� ���� �� �� ����� �� Perl, ��� ������ � ����������� PHP? ���� � ��� ���� �����-���� �������� � ���������������� �� PHP, �� ������ �������� ���������� ����� (safe_mode=on) ��� ��������� ������� (disable_functions=...). ���������� ����� ��������� ������ � ������, �� ������������� ������������, ��������� �������� ���������� ��������� ����� ���������� �����������, ��������� ������� � �.�.

�� ��������� Apache ��������� ��� � ���������, ��� ������������ PHP.

$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
HEAD / HTTP/1.0

HTTP/1.1 200 OK
Date: Tue, 03 Apr 2001 11:22:41 GMT
Server: Apache/1.3.14 (Unix)  (Red-Hat/Linux) mod_ssl/2.7.1
        OpenSSL/0.9.5a PHP/4.0.4pl1 mod_perl/1.24
Connection: close
Content-Type: text/html

Connection closed by foreign host.
������� expose_PHP = Off � /etc/php.ini ����� ������ ��� ����������:
Server: Apache/1.3.14 (Unix)  (Red-Hat/Linux) mod_ssl/2.7.1
OpenSSL/0.9.5a mod_perl/1.24


� ������ /etc/php.ini (PHP4) � /etc/httpd/php3.ini ���� ����� ����������, ������� ����� ������ �������� �������. ��������, ����� "magic_quotes_gpc" ��������� �������� ����� ��������� � ���������� ������� ��������� � ����������, ���������� ����� ������ GET, POST � �� cookie; ��� ������ ��������� �������, ������� �� ������ � ����� �������� �� Perl.

 

�����

�������� ��� ������ ����� ������� ��� ��������� ����� ��������� ������ �� ����� �����. ��� ���������� ����������, ������� ������������ ������ ���� � ����. ���� ����� ������, ����� ���������� �� ������ ���������������� (��������, ������, ���������� ������, � ���������� ������ ��� ���� From: ����� ��������, ������������� �������� �������� ��� ��������). �������� ����� �����. ��� ������ ������ �������� �� ���-�����, ����� �������, ��� ������� ���� ������� ��������� ������������ ��� � ����������������� �����.

��� ������ ��������� ���� ������ � ���������� ����������������. �� ��������, ��� ������� ��� ������ �������� ���� � ������������, ������� �������������� �� ������ �����������, � ������� �� ������ ��������� �� �������� �������� ������������ ��� �������������� � ���������������� ������ ����������. ���������� ������������ ����� ������������ ��-�� ������������ ����� ���������� ���������� (���������� �������������, ������������� � ������� ����, ��������� ������ � �.�.). ��� �� ����� ������, ������� ������������� ������ ��� ����� ������������� ����������, ����� ����� ������� ��� ����� ���������� ����������, � ������ ��������� ������������ ����� ������� ����� ��������������.


 

��������� ������� �������������� ��� ������������ � URI

URI ��� (ISO 8859-1) ������
%00 \0 (����� ������)
%0a \n (������� �������)
%20 ������
%21 !
%22 "
%23 #
%26 & (���������)
%2f /
%3b ;
%3c <
%3e >
������� 1 : ������������ ISO 8859-1 � ��������

 

������


 

��������� guestbook.cgi � ��������

#!/usr/bin/perl -w

# guestbook.cgi

BEGIN { $ENV{PATH} = '/usr/bin:/bin' }
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};   # ������� %ENV ���������� =:-)
print "Content-type: text/html\n\n";
print "<HTML>\n<HEAD><TITLE>������� �������� �����</TITLE></HEAD>\n";
&ReadParse(\%input);
my $email= $input{email};
my $texte= $input{texte};
$texte =~ s/\n/<BR>/g;

print "<BODY><A HREF=\"guestbook.html\">
       �������� ����� </A><BR><form action=\"$ENV{'SCRIPT_NAME'}\">\n
      Email: <input type=text name=email><BR>\n
      �����:<BR>\n<textarea name=\"texte\" rows=15 cols=70>
      </textarea><BR><input type=submit value=\"������!\">
      </form>\n";
print "</BODY>\n";
print "</HTML>";
open (FILE,">>guestbook.html") || die ("�� ���� ��������\n");
print FILE "Email: $email<BR>\n";
print FILE "�����: $texte<BR>\n";
print FILE "<HR>\n";
close(FILE);
exit(0);

sub ReadParse {
  my $in =shift;
  my ($i, $key, $val);
  my $in_first;
  my @in_second;

  # ������ ������
  if ($ENV{'REQUEST_METHOD'} eq "GET") {
    $in_first = $ENV{'QUERY_STRING'};
  } elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN,$in_first,$ENV{'CONTENT_LENGTH'});
  }else{
    die "������: ����������� ����� �������\n";
  }

  @in_second = split(/&/,$in_first);

  foreach $i (0 .. $#in_second) {
    # �������� ����� �� �������
    $in_second[$i] =~ s/\+/ /g;

    # ��������� �� ���� � ��������
    ($key, $val) = split(/=/,$in_second[$i],2);

    # ���������������� %XX �� ���������������� ����� � �������
    $key =~ s/%(..)/pack("c",hex($1))/ge;
    $val =~ s/%(..)/pack("c",hex($1))/ge;

    # ����������� ���� � ��������
    $$in{$key} .= "\0" if (defined($$in{$key}));
    $$in{$key} .= $val;

  }

  return length($#in_second);
}


 

�������� �������

� ������ ������� ���� �������� �������. �� ���� �������� �� ������ �������� ���� ����������� ��� ����������� ����������� ������ ��������� :
 talkback page 

Webpages maintained by the LinuxFocus Editor team
© Fr�d�ric Raynal, Christophe Blaess, Christophe Grenier, FDL
LinuxFocus.org
Translation information:
fr --> -- : Fr�d�ric Raynal, Christophe Blaess, Christophe Grenier <pappy(_at_)users.sourceforge.net, ccb(_at_)club-internet.fr, grenier(_at_)nef.esiea.fr>
fr --> en: Georges Tarbouriech <georges.t(_at_)linuxfocus.org>
en --> en: Lorne Bailey <sherm_pbody(_at_)yahoo.com>
en --> ru: Kolobynin Alexey <alexey_ak0(_at_)mail.ru>

2002-09-26, generated by lfparser version 2.31