2012-01-03 17 views
5

do mojej wiedzy po skażeniu zmiennej, Perl nie pozwoli jej używać w systemie(), exec(), otwartych potokach, eval(), komendach backtick lub jakiejkolwiek funkcji, która wpływa na coś poza programem (np. jako odłączenie). Więc jaki jest proces, aby go nie rozplątać?Jak "odświeżyć" zmienną?

+0

Większość rozdziale Bezpieczeństwa Mastering Perl przechodzi przez to, i to nie tylko co jest w perlsec. :) –

Odpowiedz

12

użyć wyrażenia regularnego na zmienną skażonej wyciągnąć „bezpiecznej” wartości:

Czasem trzeba po prostu usunąć taintedness zapisywanych danych. Wartości mogą być nieskażone, używając ich jako kluczy w haszyszu; w przeciwnym razie jedynym sposobem na ominięcie mechanizmu skażenia jest odniesienie podtypów z dopasowywania wyrażenia regularnego. Perl zakłada, że ​​jeśli odwołasz się do podłańcucha za pomocą $ 1, $ 2 itd., Wiedziałeś, co robiłeś, gdy pisałeś wzorzec.

Nie ignoruj ​​tego ostrzeżenia jednak:

Oznacza to, że przy użyciu odrobiny myślenia - Do not ślepo untaint niczego, albo pokonać cały mechanizm. Lepiej sprawdzić, czy zmienna zawiera tylko dobre znaki (dla pewnych wartości "dobrych"), a nie sprawdzać, czy ma złe znaki. To dlatego, że zbyt łatwo jest przeoczyć złe postacie, o których nigdy nie myślałeś.

Perlsec: Laundering and Detecting Tainted Data

+1

+1 za odpowiednią standardową dokumentację. Chcę dodać, że użycie '$ 1' i przyjaciół nie jest obowiązkowe, wyrażenie match z captures zwraca listę skalarów, które są nieskażone. Przykład: 'perl -T -MDevel :: Peek -e'Dump [$ ARGV [0] = ~/(\ d +)/g] '' Fiorina" Fury "161 Class C Work Correctional Unit (nr rej. 12037154) w jeden punkt utrzymywał tysiące więźniów o maksymalnym ryzyku chromosomu podwójnego Y, ale w 2179 poparł dwudziestu dwóch więźniów i trzech kuratorów. " – daxim

6

use Untaint:

OPIS

Moduł ten jest używany do prania danych, które zostały skażone stosując przełącznik -T być w trybie zabarwienie. Można go używać do skryptów CGI , a także skryptów wiersza poleceń. Moduł rozwiąże skalary, tablice i skróty. Podczas prania matrycy prane są tylko uszkodzone elementy tablicy .

SYNOPTYKA

use Untaint; 

my $pattern = qr(^k\w+); 

my $foo = $ARGV[0]; 

# Untaint a scalar 
if (is_tainted($foo)) { 
     print "\$foo is tainted. Attempting to launder\n"; 
     $foo = untaint($pattern, $foo); 
}else{ 
     print "\$foo is not tainted!!\n"; 
}