Как я могу обойти 'умереть' вызов в библиотеке Perl, которую я не могу изменить?

Параметрированный запрос И проверка ввода - это путь. Существует множество сценариев, в которых может произойти SQL-инъекция, хотя используется mysql_real_escape_string().

Эти примеры уязвимы для SQL-инъекции:

$offset = isset($_GET['o']) ? $_GET['o'] : 0;
$offset = mysql_real_escape_string($offset);
RunQuery("SELECT userid, username FROM sql_injection_test LIMIT $offset, 10");

или

$order = isset($_GET['o']) ? $_GET['o'] : 'userid';
$order = mysql_real_escape_string($order);
RunQuery("SELECT userid, username FROM sql_injection_test ORDER BY `$order`");

В обоих случаях вы не можете использовать ' для защиты инкапсуляции.

Источник : Непредвиденная инъекция SQL (при эвакуации Недостаточно)

30
задан Makoto 21 May 2015 в 06:33
поделиться

3 ответа

Вы могли обернуть его в eval. См.:

perldoc -f eval

, Например, Вы могли записать:

# warn if routine calls die
eval { routine_might_die }; warn $@ if $@;

Это превратит фатальную ошибку в предупреждение, которое является более или менее, что Вы предложили. Если die назван, $@ содержит строку, переданную ему.

67
ответ дан Jon Ericson 27 November 2019 в 23:05
поделиться

Это захватывает $SIG{__DIE__}? Если это делает, то это более локально, чем Вы. Но существует пара стратегий:

  • можно вызвать его пакет и , переопределение умирает:

    package Library::Dumb::Dyer;
    use subs 'die';
    sub die {
        my ( $package, $file, $line ) = caller();
        unless ( $decider->decide( $file, $package, $line ) eq 'DUMB' ) {
            say "It's a good death.";
            die @_;
       }
    } 
    
  • В противном случае может прерывание это. (ищите $SIG на странице, скидка с цены не обрабатывает полную ссылку.)

    my $old_die_handler = $SIG{__DIE__};
    sub _death_handler { 
        my ( $package, $file, $line ) = caller();
        unless ( $decider->decide( $file, $package, $line ) eq 'DUMB DIE' ) {
            say "It's a good death.";
            goto &$old_die_handler;
        }
    }
    $SIG{__DIE__} = \&_death_handler;
    
  • Вам, возможно, придется просканировать библиотеку, находить sub что это всегда вызовы и использование что загрузить Ваш $SIG обработчик путем переопределения that.

    my $dumb_package_do_something_dumb = \&Dumb::do_something_dumb;
    *Dumb::do_something_dumb = sub { 
        $SIG{__DIE__} = ...
        goto &$dumb_package_do_something_dumb;
    };
    
  • Или переопределение встроенное, что это всегда вызовы...

    package Dumb; 
    use subs 'chdir';
    sub chdir { 
        $SIG{__DIE__} = ...
        CORE::chdir @_;
    };
    
  • , Если все остальное перестало работать, можно хлестать глаза лошади с этим:

    package CORE::GLOBAL;
    use subs 'die';
    
    sub die { 
        ... 
        CORE::die @_;
    }
    

Это переопределит , умирают глобально, единственный способ, которым можно возвратиться die, состоит в том, чтобы обратиться к нему как CORE::die.

Некоторая комбинация этого будет работать.

27
ответ дан Axeman 27 November 2019 в 23:05
поделиться

Хотя изменение умирает , чтобы не умирать, имеет определенное решение, как показано в других ответах, в целом вы всегда можете переопределить подпрограммы в других пакетах. Вы не изменяете оригинальный источник вообще.

Во-первых, загрузите оригинальную упаковку, чтобы получить все оригинальные определения. Как только оригинал на месте, вы можете переопределить проблемный подпрограмм:

 BEGIN {
      use Original::Lib;

      no warnings 'redefine';

      sub Original::Lib::some_sub { ... }
      }

Вы можете даже вырезать и вставить оригинальное определение и настраивать то, что вам нужно. Это не отличное решение, но если вы не можете изменить исходный источник (или хотите попробовать что-то, прежде чем изменить оригинал), он может работать.

Кроме того, вы можете скопировать исходный файл исходного сигнала в отдельный каталог для вашего приложения. Поскольку вы управляете этим каталогом, вы можете редактировать в него файлы. Вы измените эту копию и загрузите его, добавив этот каталог на путь поиска модуля PERL:

use lib qw(/that/new/directory);
use Original::Lib;  # should find the one in /that/new/directory

Ваша копия палочки, даже если кто-то обновляет оригинальный модуль (хотя вы можете объединить изменения).

Я говорю об этом совсем немного в овладении Perl , где я показываю некоторые другие методы, чтобы сделать такую ​​вещь. Хитрость - не сломать вещи еще больше. Как вы не ломаете, вещи зависит от того, что вы делаете.

8
ответ дан 27 November 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: