|
|
|
| попробовал сделать простенький скрипт.pl , получающий одну только $_GET['dir'] , ;)
#!/usr/bin/perl
print "Content-Type: text/html\n\n";
$method = $ENV{'REQUEST_METHOD'};
if ($method eq "GET") {
$form_data = $ENV{'QUERY_STRING'};
} else {
read (STDIN, $form_data, $ENV{'CONTENT_LENGTH'});
}
$form_data =~ s/%(..)/pack ("C", hex ($l))/eg;
$form_data =~ tr/+/ /;
@pairs = split(/&/, $form_data);
foreach $pair (Spairs)
{
($name, $value)=split(/=/,$pair);
$FORM{$name}=$value;
}
if (!$FORM{'dir'}) {
$dir = "D:\\WebServers\\home\\localhost\\www";
} else {
$dir = $FORM{'dir'} ;
}
| , ещё и не пойму где ошибка :) Там нет такого как в php простого $dir = $_GET['dir'] ?
Одну ошибку нашёл S вместо $, что-то загадочное в этом $form_data =~ s/%(..)/pack ("C", hex ($l))/eg;
, и что за $l ? Вырезал с Perl.chm из /downloads/ | |
|
|
|
|
|
|
|
для: EXP
(25.07.2007 в 14:16)
| | $1 - в данном случае это переменная создается от регулярного выражения %(..). Такой rawurldecode() я бы сказал. | |
|
|
|
|
|
|
|
для: Unkind
(25.07.2007 в 15:52)
| | похоже настроил ; получается что-то типа этого
$method = $ENV{'REQUEST_METHOD'};
if ($method == "GET") {
$form_data = $ENV{'QUERY_STRING'};
} else {
$form_data =~ s/%(..)/pack("C", hex($1))/eg;
}
$form_data =~ tr/+/ /;
@pairs = split(/&/, $form_data);
foreach $pair (@pairs)
{
($name, $value) = split(/=/, $pair);
$FORM{$name}=$value;
}
if (!$FORM{'dir'}) {
$dir = "D:\\WebServers";
} else {
$dir = $FORM{'dir'} ;
}
|
, только $_POST'ом ещё не тестил , и не понятно чем наоборот rawurlкодировать ;) | |
|
|
|
|
|
|
|
для: EXP
(25.07.2007 в 19:15)
| | Как-нибудь так:
#!/usr/bin/perl
sub rawurlencode($)
{
$result = '';
for($i = 0; $i < length($_[0]); $i++)
{
$lttr = substr($_[0], $i, 1);
$ord = ord($lttr);
if($ord == 0x2E || ($ord > 0x61 && $ord < 0x7A) || ($ord > 0x41 && $ord < 0x5A))
{
$result .= $lttr;
}
else
{
$result .= '%' . sprintf('%02X', $ord);
}
}
return $result;
}
print('Content-type: text/plain; charset=utf-8' . (chr(13) . chr(10) x 2));
$string = 'String...!@#$';
print(rawurlencode($string));
|
Только мм я не понял, а как выдрать один байт из скаляра, чтобы Perl не путал это с запросом элемента хеша или массива?
UPD. А вообще-то...
$string =~ s/([^a-zA-Z\.]{1})/sprintf('%%%02X', ord($1))/eg;
|
:)) | |
|
|
|
|
|
|
|
для: Unkind
(25.07.2007 в 15:52)
| | Крайне грязный код.
Как и большинство perl-кода впрочем.
Не знаю, можно ли тут впихнуть инъекцию ....
Но ошибки в декодировании параметров точно есть.
Видно, что и амперсенд и знак равенства могут быть подсажены из пользовательских данных, и как результат, мы имеем по меньшей мере - искажение кода. А по пущей - генерацию навязанных переменных формы.
Вот почему я не люблю перл.
Люди, которые программируют на нем (не все, конечно, но изрядная часть людей)
мнят себя профессионалами, не являясь ими ну никак.
А ведь невооруженным глазом не разглядишь....
Я не про нас, тут собравшихся... я про того, кто этот код в открытый доступ выложил....
Ну не умеешь петь - не пей!
Нет. Будут ведь же...
А перл, такой язык, который на все эти грязные приемчики, достойные лишь того, чтоб тихонечко себе отчетик в уголку накропать - а он и создан был для этого!!! - он на них провоцирует. | |
|
|
|
|
|
|
|
для: Trianon
(25.07.2007 в 20:03)
| | Вы ответили мне на сообщение 25.07.2007 в 15:52? А почему мне? :) | |
|
|
|
|
|
|
|
для: Unkind
(25.07.2007 в 20:41)
| | Ошибся. | |
|
|
|
|
|
|
|
для: Trianon
(25.07.2007 в 20:53)
| | Ошиблись где? В том, что сообщение не мне или в том, что выбрали сообщение не с той датой? :) | |
|
|
|
|
|
|
|
для: Trianon
(25.07.2007 в 20:53)
| | - | |
|
|
|
|
|
|
|
для: Unkind
(25.07.2007 в 20:57)
| | >Ошиблись где? В том, что сообщение не мне или в том, что выбрали сообщение не с той датой? :)
Сообщение адресовано всем, в общем-то.
Выбирать Вашу (235609) реплику, как точку привязки своей, у меня никаких оснований не было. Перепутал с 235560. | |
|
|
|